architext 0.0.5 → 0.0.6
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/CHANGELOG.md +29 -1
- package/README.md +18 -16
- package/README.zh-CN.md +15 -14
- package/dist/index.js +43 -29
- package/dist/templates/en/briefs/_base.md +13 -6
- package/dist/templates/en/briefs/_modules.md +2 -2
- package/dist/templates/en/docs/global/error_memory.json +40 -0
- package/dist/templates/en/docs/global/map.json +46 -90
- package/dist/templates/en/{rules/04_cli_tools.md → docs/global/references/cli_reference.md} +6 -13
- package/dist/templates/en/{rules/02_tech_stack.md → docs/global/tech_stack.md} +7 -18
- package/dist/templates/en/docs/global/vision.md +1 -1
- package/dist/templates/en/docs/prompts/audit.md +5 -5
- package/dist/templates/en/docs/prompts/code.md +23 -11
- package/dist/templates/en/docs/prompts/edit.md +21 -7
- package/dist/templates/en/docs/prompts/fix.md +11 -2
- package/dist/templates/en/docs/prompts/inherit.md +18 -13
- package/dist/templates/en/docs/prompts/map.md +4 -3
- package/dist/templates/en/docs/prompts/plan.md +11 -5
- package/dist/templates/en/docs/prompts/remove.md +13 -8
- package/dist/templates/en/docs/prompts/revise.md +10 -2
- package/dist/templates/en/docs/prompts/scope.md +4 -3
- package/dist/templates/en/docs/prompts/script.md +102 -0
- package/dist/templates/en/docs/prompts/start.md +20 -14
- package/dist/templates/en/docs/prompts/ui.md +113 -0
- package/dist/templates/en/docs/shared/ui-redlines.md +7 -0
- package/dist/templates/en/docs/templates/spec.template.md +1 -1
- package/dist/templates/en/docs/templates/ui.template.md +8 -8
- package/dist/templates/en/rules/00_system.md +245 -51
- package/dist/templates/en/rules/90_custom_rules.md +3 -1
- package/dist/templates/en/skills/archi-data-sync/SKILL.md +26 -12
- package/dist/templates/en/skills/archi-decompose-roadmap/SKILL.md +137 -208
- package/dist/templates/en/skills/archi-design-patterns/SKILL.md +6 -2
- package/dist/templates/en/skills/archi-feature-relations/SKILL.md +6 -2
- package/dist/templates/en/skills/archi-interview-protocol/SKILL.md +1 -2
- package/dist/templates/en/skills/archi-plan-options/SKILL.md +77 -302
- package/dist/templates/en/skills/archi-silent-audit/SKILL.md +4 -5
- package/dist/templates/en/skills/archi-ui-wireframe/SKILL.md +131 -306
- package/dist/templates/icon.svg +16 -0
- package/dist/templates/zh/briefs/_base.md +17 -10
- package/dist/templates/zh/briefs/_modules.md +2 -2
- package/dist/templates/zh/docs/global/error_memory.json +40 -0
- package/dist/templates/zh/docs/global/map.json +39 -109
- package/dist/templates/zh/{rules/04_cli_tools.md → docs/global/references/cli_reference.md} +0 -7
- package/dist/templates/zh/{rules/02_tech_stack.md → docs/global/tech_stack.md} +9 -20
- package/dist/templates/zh/docs/global/vision.md +1 -1
- package/dist/templates/zh/docs/prompts/audit.md +5 -5
- package/dist/templates/zh/docs/prompts/code.md +22 -10
- package/dist/templates/zh/docs/prompts/edit.md +20 -6
- package/dist/templates/zh/docs/prompts/fix.md +10 -1
- package/dist/templates/zh/docs/prompts/inherit.md +18 -13
- package/dist/templates/zh/docs/prompts/map.md +5 -4
- package/dist/templates/zh/docs/prompts/plan.md +11 -5
- package/dist/templates/zh/docs/prompts/remove.md +13 -8
- package/dist/templates/zh/docs/prompts/revise.md +12 -4
- package/dist/templates/zh/docs/prompts/scope.md +4 -3
- package/dist/templates/zh/docs/prompts/script.md +102 -0
- package/dist/templates/zh/docs/prompts/start.md +19 -15
- package/dist/templates/zh/docs/prompts/ui.md +113 -0
- package/dist/templates/zh/docs/shared/ui-redlines.md +7 -0
- package/dist/templates/zh/docs/templates/spec.template.md +1 -1
- package/dist/templates/zh/docs/templates/ui.template.md +8 -8
- package/dist/templates/zh/rules/00_system.md +243 -49
- package/dist/templates/zh/rules/90_custom_rules.md +2 -1
- package/dist/templates/zh/skills/archi-data-sync/SKILL.md +27 -13
- package/dist/templates/zh/skills/archi-decompose-roadmap/SKILL.md +133 -204
- package/dist/templates/zh/skills/archi-design-patterns/SKILL.md +6 -2
- package/dist/templates/zh/skills/archi-feature-relations/SKILL.md +6 -2
- package/dist/templates/zh/skills/archi-interview-protocol/SKILL.md +1 -2
- package/dist/templates/zh/skills/archi-plan-options/SKILL.md +77 -302
- package/dist/templates/zh/skills/archi-silent-audit/SKILL.md +4 -5
- package/dist/templates/zh/skills/archi-ui-wireframe/SKILL.md +131 -306
- package/package.json +3 -1
- package/dist/templates/en/rules/01_workflow.md +0 -95
- package/dist/templates/en/rules/03_data_governance.md +0 -106
- package/dist/templates/en/rules/99_context_glue.md +0 -53
- package/dist/templates/zh/rules/01_workflow.md +0 -95
- package/dist/templates/zh/rules/03_data_governance.md +0 -106
- package/dist/templates/zh/rules/99_context_glue.md +0 -53
package/dist/index.js
CHANGED
|
@@ -1,50 +1,64 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{cac as fi}from"cac";var oe={name:"architext",version:"0.0.5",description:"The DDAD (Document-Driven AI Development) protocol and prompt scaffolder for AI-native engineering.",type:"module",scripts:{build:"tsup",dev:"tsx src/index.ts",lint:"eslint . && prettier --check .",test:"vitest","test:ui":"vitest --ui","test:coverage":"vitest --coverage","test:run":"vitest run",prepublishOnly:"npm run build",prepare:"husky"},"lint-staged":{ignore:["website/.astro/**"],"*.{js,ts,tsx,jsx}":["eslint --fix","prettier --write"],"*.{json,md}":["prettier --write"]},files:["dist","README.md","README.zh-CN.md","CHANGELOG.md","LICENSE"],bin:{architext:"./dist/index.js",archi:"./dist/index.js"},keywords:["architext","ddad","document-driven","ai","llm","prompt-engineering","scaffold","cli","architecture","spec","template","code-generation"],author:"JiuNian3219 <qin0yu0lou@gmail.com>",license:"MIT",devDependencies:{"@commitlint/cli":"^20.3.1","@commitlint/config-angular":"^20.3.1","@eslint/js":"^9.39.2","@types/fs-extra":"^11.0.4","@types/node":"^25.2.1","@vitest/coverage-v8":"^4.0.18","@vitest/ui":"^4.0.18",eslint:"^9.39.2","eslint-config-prettier":"^10.1.8",globals:"^17.1.0",husky:"^9.1.7","lint-staged":"^16.2.7","mock-fs":"^5.5.0",prettier:"^3.8.1",tsup:"^8.5.1",tsx:"^4.21.0",typescript:"^5.9.3","typescript-eslint":"^8.53.1",vitest:"^4.0.18"},dependencies:{"@clack/prompts":"^0.11.0",cac:"^6.7.14",chalk:"^5.6.2","fs-extra":"^11.3.3",picocolors:"^1.1.1",zod:"^4.3.6"}};import{intro as hr,outro as it}from"@clack/prompts";import O from"picocolors";import re from"picocolors";var l={info:e=>console.log(re.cyan(e)),success:e=>console.log(re.green(e)),warn:e=>console.warn(re.yellow(e)),error:e=>console.error(re.red(e)),dim:e=>console.log(re.dim(e)),step:e=>console.log(re.cyan(`\u27A4 ${e}`)),done:e=>console.log(re.green(`\u2714 ${e}`)),fail:e=>console.error(re.red(`\u2716 ${e}`)),raw:e=>console.log(e),clear:()=>console.clear()};var Ot={common:{coming_soon:"\u{1F6A7} This feature is coming soon, stay tuned!",error:{unexpected:"\u274C Unexpected Error: {msg}",unknown:"\u274C Unknown error occurred",internal:"\u274C Internal Error [{code}]: {msg}",cancel:"\u{1F6AB} {msg}"}},init:{desc:"Initialize Architext Framework, configure editor rules and document skeleton",editor:"Target IDE, multiple selection is supported, separated by commas (cursor/windsurf/trae/vscode/claude/opencode)",lang:"Rules and document skeleton language",doc:"Custom document path, default is .architext",type:"Project features, comma-separated (ui,data,api,cli,lib,mobile,desktop,miniapp,extension,realtime,ai)",yes:"Skip all confirmation prompts (auto-confirm overwrite)",brief:"Generate project-brief.md (use with -y to skip interaction)",failed:"Initialization failed"},update:{desc:"Sync latest rules, update editor rules and document skeleton",failed:"Update failed",version_gap_warning:"Project structure (v{project}) is far behind CLI (v{current}). Auto-update may be incomplete. Consider: 1) Run npx archi pack to backup; 2) Use AI to help merge pack output; 3) Or re-run npx archi init (loses customizations)",dry_run_msg:"\u{1F50D} Dry run mode enabled.",construction:"Update feature is under construction..."},uninstall:{desc:"Remove Architext framework and generated files"},doctor:{desc:"Project health check: config, doc structure, global files and IDE rules",failed:"System check failed",success:"System Check: All Good"},task:{desc:"Manage project roadmap tasks",status:"Update task status (pending|active|done|blocked)",check:"Check roadmap consistency"},plan:{desc:"Check implementation plan (plan.json) completion status",id_required:"Please specify Task ID (e.g.: archi plan SUB-01)"},render:{desc:"Render JSON data files into Markdown views"},template:{desc:"Fetch template files to project root"},help:{desc:"Display Architext command help information"},pack:{desc:"Pack user data (docs, tasks, custom rules) for backup before upgrade or migration",output:"Output file path (default: architext-pack.xml)"},scaffold:{fallback:"Template for {lang} not found, falling back to 'zh'",step_docs:"Scaffolding documentation structure...",step_rules:"Installing core rules...",step_ide:"Distributing IDE rules...",step_processing:"Processing {group}...",complete:"Scaffold complete."},templates:{error:{root_not_found:"Templates directory not found. Searched in: {paths}"}},command:{init:{title:"Initialize Architext Framework for deploying standardized AI context protocols & IDE rules.",select_editor:"Select target editors",select_lang:"Select documentation language",select_features:"Select project features (multi-select)",select_generate_brief:"Generate project-brief.md at project root? (Fill in project requirements for /archi.start or /archi.inherit)",select_doc_dir:"Enter documentation directory",config_exists:"Existing config (architext.json) detected. Overwrite?",config_saved:"Config saved to architext.json",conflict_title:"\u26A0\uFE0F File Conflict Detected",conflict_msg:"The following files already exist. How to proceed?",conflict_more:" ... ({count} more files)",conflict_overwrite:"Overwrite",conflict_skip:"Skip",conflict_cancel:"Cancel",installing:"Copying files...",cancel:"Initialization cancelled",failed:"Initialization failed",success:"Architext initialized successfully! \u{1F680}"},uninstall:{desc:"Remove Architext framework and generated files",title:"Architext Uninstall Wizard",confirm_title:"\u26A0\uFE0F Danger Zone",confirm_msg:"This will PERMANENTLY delete the following. Continue?",files_to_delete:"Files/Directories to be deleted:",done:"Uninstall done",success:"Architext successfully removed.",error:"Uninstall error occurred.",cancel:"Uninstall cancelled.",not_found:"Configuration (architext.json) not found. Cannot auto-uninstall.",cleaning:"Cleaning up...",legacy_no_version:"This project uses an older version of Architext and cannot be auto-uninstalled.",legacy_manual_hint:"Please manually delete the following:",legacy_exit:"Please clean up manually and try again"},task:{check:{invalid_dep:"Task [{id}] has invalid dependency: [{depId}] does not exist in task list",consistent:"Roadmap is consistent."},update:{id_required:"Task ID is required for status update. Usage: architext task <id> --status <status>",updating:"Updating task [{id}] to {status}...",done:"Task [{id}] -> {status}",unblocked:"Task [{id}] unblocked -> pending (all deps done)"},list:{empty:"No tasks found in roadmap.",title:"Project Roadmap Status"}},plan:{title:"Plan Check: {id} {name}",section_pass:"[{done}/{total}]",section_manual:"[{done}/{total}] (skipped \u2014 manual verification)",unchecked_item:" L{line}: {content}",total:"Total: {done}/{total} ({percent}%)",all_done:"All automated tasks complete!",remaining:"{count} tasks remaining",empty:"No checkbox tasks found in plan file",not_found:"Plan file not found for [{id}] (plan.json)"},template:{usage:"Usage: npx archi template <name> Available templates:",unknown:'Unknown template "{name}". Available: {available}',exists:"{path} already exists, skipped. Delete it first to regenerate.",done:"Generated {path}. Fill it in and run /archi.scope to start decomposition.",not_found:"Template file {name} not found. Run npx archi init first."},render:{empty:"No JSON data files found to render.",done:"Render complete. Generated {count} Markdown view(s).",plan:{header_comment:"<!-- \u26A0\uFE0F AUTO-GENERATED from plan.json \u2014 DO NOT EDIT DIRECTLY -->",header_ai:"<!-- AI: Read plan.json, not this file -->",title:"Implementation Plan: {featureName}",feature_id:"Task ID",status:"Status",section_decisions:"Technical Decisions",section_steps:"Implementation Steps",section_tests:"Test Plan",subsection_automated:"Automated Tests",subsection_manual:"Manual Verification"},roadmap:{header_comment:"<!-- \u26A0\uFE0F AUTO-GENERATED from roadmap.json \u2014 DO NOT EDIT DIRECTLY -->",header_ai:"<!-- AI: Read roadmap.json, not this file -->",title:"Project Roadmap",status:"Status",updated:"Updated",phase:"Phase",goal:"Goal",dep:"Dep",dep_none:"None",tag:"Tag",slug:"Slug"}},update:{title:"Architext Update Wizard",no_config:"No config file (architext.json) found. Please run npx archi init first.",cancel:"Update cancelled",success:"Update complete!",failed:"Update failed",version_checking:"Checking latest version...",version_check_skip:"Version check skipped (network unavailable)",version_outdated:"New version v{latest} available (current: v{current})",version_upgrade_hint:"Upgrade command: {cmd}",version_up_to_date:"Already up to date: v{version}",legacy_migration_blocked:"Project is missing structure version info. Auto-update is not supported. Please migrate manually:",legacy_migration_step1:" 1. npx archi pack Back up your document data",legacy_migration_step2:" 2. npx archi uninstall Remove old framework files (delete any leftovers manually)",legacy_migration_step3:" 3. npx archi init Re-initialize with the new structure",legacy_migration_step4:" 4. /archi.recover <pack-file> Restore your document data in AI",version_too_new:"Project structure version (v{project}) is newer than CLI supports (v{cli}). Please upgrade: npm install -g architext@latest",update_warning:"Old framework files will be removed and the latest version will be redeployed:",update_skip_hint:"Won't touch: {list}",update_global_hint:"Global docs (roadmap.json, vision.md, etc. in global/) are add-only \u2014 existing files won't be overwritten",update_confirm:"Confirm update?",removing_old:"Removing old framework files...",removed_old:"Removed {count} old files",deploying_new:"Deploying new framework files...",deployed_new:"Deployed {framework} framework files, added {seeds} seed files",schema_auditing:"Running Schema compatibility audit...",summary:"Update Summary",summary_framework:"Refreshed {count} framework files (rules/prompts/skills/templates)",summary_seeds:"Added {count} seed files",summary_templated:"02_tech_stack has project customizations, not overwritten. New template saved to {docDir}/templates/02_tech_stack.template.md \u2014 compare and merge into your IDE rules dir (e.g. .cursor/rules/, .windsurf/rules/)",summary_skipped:"Skipped: {list}",summary_global:"Global docs (global/) are add-only \u2014 delete outdated files manually if needed",schema:{parse_error:"JSON parse failed \u2014 file may be corrupted",version_too_new:"File version (v{current}) is newer than CLI expected version (v{expected}). Please upgrade the CLI.",roadmap_migrated:"{file}: migrated from v{from} to v{to}",roadmap_ok:"{file}: schema compatible",roadmap_error:"{file}: schema incompatible",no_plans:"No plan.json files found, skipping audit",plans_ok:"All {count} plan.json files are schema-compatible",plan_error:"{file}: schema incompatible (please review manually)"}},doctor:{title:"Architext Project Health Check",no_config:"Config file not found, remaining checks skipped",group:{config:"Configuration",doc_structure:"Doc Directory Structure",global_files:"Global Files",ide_rules:"IDE Framework Files"},summary:{result:"Result: {parts}",passed:"{n} passed",warned:"{n} warnings",failed:"{n} failed"},success:"Health check passed \u2014 everything looks good",with_warnings:"Check complete with warnings \u2014 review recommended",with_errors:"Check complete with errors \u2014 please fix before proceeding",check:{config:{not_found:"Config file not found",hint_init:"Run npx archi init to initialize the project",format_label:"Config file format",format_fail:"JSON parse failed \u2014 file may be corrupted",editors_label:"Editor config",editors_empty:"No editors configured",editors_invalid:"Contains invalid editors: {list}",editors_ok:"Editors: {list}",lang_label:"Language config",lang_invalid:"Unsupported language: {lang}",lang_ok:"Language: {lang}",doc_dir:"Doc dir: {dir}",doc_dir_unset:"(not set)",doc_dir_empty:"docDir field is empty"},dir:{missing:"Directory not found",hint_init:"Run npx archi init to reinitialize",hint_update:"Run npx archi update to restore",hint_features:"Create manually: mkdir {docDir}/tasks",hint_tasks:"Create manually: mkdir {docDir}/tasks"},global:{required_missing:"Required file missing",optional_missing:"File missing (non-blocking)",parse_fail:"JSON parse failed",roadmap_ok:"roadmap.json (Schema v{version} compatible)",roadmap_hint:"Run npx archi update to attempt auto-fix"},rules:{dir_missing:"Rules directory not found",dir_hint:"Run npx archi update to restore rule files",file_missing:"Rule file missing",file_hint:"Run npx archi update to restore"}}},pack:{title:"Architext Pack",no_config:"No .architext.json found \u2014 please run archi init first",packing:"Collecting user data...",empty:"No user data found, skipping pack",empty_hint:"Running pack before filling in any docs has no effect",done:"Packed {count} files \u2192 {file}",hint_recover:"After upgrade, restore with: /archi.recover {file}",success:"Pack complete",failed:"Pack failed"},help:{tagline:"No Docs, No Code. \u2014 AI-Native Architecture Protocol",section:{ai:"AI Commands (use in Chat)",cli:"CLI Commands (use in Terminal)",quick:"Quick Start",workflow:"Typical Workflow"},ai:{start:{desc:"Cold start a new project. Interview vision, tech stack, generate doc skeleton.",detail:"Output: Vision + Tech Stack + Roadmap + Global doc skeleton",example:"e.g. /archi.start I want to build a Todo CLI tool in Rust"},inherit:{desc:"Take over a legacy project. Full code scan, reverse-engineer architecture, fill docs. Optionally provide Brief to supplement vision/roadmap.",detail:"For existing codebases lacking Architext docs; pass project-brief.md when codebase is minimal",example:"e.g. /archi.inherit project-brief.md"},scope:{desc:"Requirement decomposition. Read Scope Brief, break large requirements into Roadmap tasks with dependencies.",detail:"Output: Multiple Roadmap tasks (with ID/goal/deps). Falls back to interview mode without Brief",example:"e.g. /archi.scope scope-brief.md"},plan:{desc:"Deep task planning. Architecture interview for existing Roadmap tasks, generate full docs.",detail:"Output: Spec (logic) + UI (visual, if applicable) + Plan (steps)",example1:"e.g. /archi.plan INF-001 needs OAuth login support",example2:"e.g. /archi.plan FEAT-01"},code:{desc:"Translate docs to code. Read Plan, implement step by step with checks & audit.",detail:"Prerequisite: Task must have complete Spec + Plan",example:"e.g. /archi.code INF-001"},audit:{desc:"Independent deep code audit. Find bugs, gaps, and compliance issues.",detail:"With ID: audit specific task's code | No ID: project-level health check",example1:"e.g. /archi.audit INF-001",example2:"e.g. /archi.audit"},fix:{desc:"Fix a bug (not a requirement change). Diagnose and fix code, usually no Spec change.",detail:"Auto-records fix process to Plan for documentation consistency",example:"e.g. /archi.fix INF-001 login returns 403 error"},edit:{desc:"Local requirement change. Update Spec/UI docs first, then sync code changes.",detail:"Change chain: Update Spec/UI --> Append Plan steps --> Modify code",example:"e.g. /archi.edit INF-001 add remember-me feature"},revise:{desc:"Global change (tech stack, architecture). Analyzes impact, cascades updates to affected Tasks after confirmation.",detail:"Scope: Vision / Tech Stack / Roadmap / Related Task docs",example:"e.g. /archi.revise migrate from REST to GraphQL"},map:{desc:"Refresh architecture map. Rescan directory tree, update map.json.",detail:"Use when directory structure changes to keep map.json in sync"},remove:{desc:"Decommission a task. Full cleanup: impact analysis \u2192 delete docs+code \u2192 purge global refs.",detail:"Scope: Task docs / business code / roadmap / map / context_glue",example:"e.g. /archi.remove FEAT-003"},help:{desc:"Project navigator & contextual Q&A. Analyze state, suggest next actions.",detail:"No args: smart next-step recommendation; with question: project-aware answer",example1:"e.g. /archi.help",example2:"e.g. /archi.help what does the data model look like?"}},cli:{init:{desc:"Initialize Architext framework. Generate rules, doc directory, prompt templates. Optionally generates project-brief.md (fill in for /archi.start or /archi.inherit).",editor:"Target IDE (cursor / trae / windsurf / vscode / claude / opencode)",lang:"Language (zh / en)",doc:"Custom doc directory name (default: .architext)",type:"Project features, comma-separated (ui,data,api,cli,lib,mobile,desktop,miniapp,extension,realtime,ai)"},update:{desc:"Sync latest rule templates to project, keep rules aligned with framework version.",dry_run:"Preview changes only, no actual writes"},doctor:{desc:"Read-only health scan: config validity, directory integrity, global file schemas, IDE rule files."},task:{desc:"Manage Roadmap tasks. View progress, update status, check dependency consistency.",detail:"No args: list all tasks | --check: verify dependency consistency",example:"e.g. npx archi task INF-001 --status done"},plan:{desc:"Check Task Plan completion (auto-detects manual verification sections).",example:"e.g. npx archi plan INF-001"},render:{desc:"Render JSON data files (roadmap/plan) into human-readable Markdown views."},template:{desc:"Fetch template files to project root for filling.",example:"e.g. npx archi template scope-brief"},uninstall:{desc:"Remove Architext framework and all generated files (rules, docs, config)."}},quick:{new_project:"New project from scratch",legacy:"Take over legacy project",new_feature:"Plan a new task",write_code:"Implement code",fix_bug:"Fix a bug",check_health:"Check project health"},workflow:{init_flow:"Initial setup",new_feature:"New task:",change_spec:"Spec change:",standalone:"Standalone ops:"}}}};var At={common:{coming_soon:"\u{1F6A7} \u8BE5\u529F\u80FD\u6B63\u5728\u5F00\u53D1\u4E2D\uFF0C\u656C\u8BF7\u671F\u5F85\uFF01",error:{unexpected:"\u274C \u975E\u9884\u671F\u9519\u8BEF: {msg}",unknown:"\u274C \u53D1\u751F\u672A\u77E5\u9519\u8BEF",internal:"\u274C \u5185\u90E8\u9519\u8BEF [{code}]: {msg}",cancel:"\u{1F6AB} {msg}"}},init:{desc:"\u521D\u59CB\u5316 Architext \u6846\u67B6\uFF0C\u914D\u7F6E\u7F16\u8F91\u5668\u89C4\u5219\u548C\u6587\u6863\u9AA8\u67B6",editor:"\u6846\u67B6\u76EE\u6807IDE\uFF0C\u53EF\u591A\u9009\uFF0C\u9017\u53F7\u5206\u9694 (cursor/windsurf/trae/vscode/claude/opencode)",lang:"\u89C4\u5219\u4E0E\u6587\u6863\u9AA8\u67B6\u8BED\u8A00",doc:"\u81EA\u5B9A\u4E49\u6587\u6863\u8DEF\u5F84\uFF0C\u9ED8\u8BA4\u4F7F\u7528.architext",type:"\u9879\u76EE\u7279\u5F81\uFF0C\u9017\u53F7\u5206\u9694 (ui,data,api,cli,lib,mobile,desktop,miniapp,extension,realtime,ai)",yes:"\u8DF3\u8FC7\u6240\u6709\u786E\u8BA4\u63D0\u793A\uFF08\u8986\u76D6\u5DF2\u6709\u914D\u7F6E\u65F6\u81EA\u52A8\u786E\u8BA4\uFF09",brief:"\u751F\u6210 project-brief.md\uFF08\u4E0E -y \u914D\u5408\u4F7F\u7528\u53EF\u8DF3\u8FC7\u4EA4\u4E92\uFF09",failed:"\u521D\u59CB\u5316\u5931\u8D25"},update:{desc:"\u540C\u6B65\u6700\u65B0\u89C4\u5219\uFF0C\u66F4\u65B0\u7F16\u8F91\u5668\u89C4\u5219\u548C\u6587\u6863\u9AA8\u67B6",failed:"\u5347\u7EA7\u5931\u8D25",version_gap_warning:"\u9879\u76EE\u7ED3\u6784\u7248\u672C (v{project}) \u4E0E CLI (v{current}) \u5DEE\u8DDD\u8F83\u5927\uFF0C\u81EA\u52A8\u66F4\u65B0\u53EF\u80FD\u4E0D\u5B8C\u6574\u3002\u5EFA\u8BAE\uFF1A1) \u8FD0\u884C npx archi pack \u5907\u4EFD\uFF1B2) \u5C06 pack \u8F93\u51FA\u4EA4\u7ED9 AI \u8F85\u52A9\u5408\u5E76\uFF1B3) \u6216\u91CD\u65B0 npx archi init\uFF08\u4F1A\u4E22\u5931\u5B9A\u5236\uFF09",dry_run_msg:"\u{1F50D} \u9884\u6F14\u6A21\u5F0F\u5DF2\u542F\u7528\u3002",construction:"\u66F4\u65B0\u529F\u80FD\u6B63\u5728\u5EFA\u8BBE\u4E2D..."},uninstall:{desc:"\u79FB\u9664 Architext \u6846\u67B6\u53CA\u5176\u751F\u6210\u7684\u6587\u4EF6"},doctor:{desc:"\u9879\u76EE\u5065\u5EB7\u68C0\u67E5\uFF1A\u914D\u7F6E\u3001\u76EE\u5F55\u7ED3\u6784\u3001\u5168\u5C40\u6587\u6863\u4E0E IDE \u89C4\u5219",failed:"\u73AF\u5883\u81EA\u68C0\u5931\u8D25",success:"\u7CFB\u7EDF\u68C0\u67E5\u901A\u8FC7\uFF1A\u4E00\u5207\u6B63\u5E38"},task:{desc:"\u7BA1\u7406\u9879\u76EE Roadmap \u4EFB\u52A1",status:"\u66F4\u65B0\u4EFB\u52A1\u72B6\u6001 (pending|active|done|blocked)",check:"\u68C0\u67E5 Roadmap \u4E00\u81F4\u6027"},plan:{desc:"\u68C0\u67E5\u529F\u80FD\u5B9E\u73B0\u8BA1\u5212 (plan.json) \u7684\u5B8C\u6210\u5EA6",id_required:"\u8BF7\u6307\u5B9A Task ID (\u4F8B\u5982: archi plan SUB-01)"},render:{desc:"\u5C06 JSON \u6570\u636E\u6587\u4EF6\u6E32\u67D3\u4E3A Markdown \u89C6\u56FE"},template:{desc:"\u83B7\u53D6\u6A21\u677F\u6587\u4EF6\u5230\u9879\u76EE\u6839\u76EE\u5F55"},help:{desc:"\u663E\u793A Architext \u547D\u4EE4\u5E2E\u52A9\u4FE1\u606F"},pack:{desc:"\u6253\u5305\u7528\u6237\u6570\u636E\uFF08\u6587\u6863\u3001\u4EFB\u52A1\u3001\u81EA\u5B9A\u4E49\u89C4\u5219\uFF09\uFF0C\u7528\u4E8E\u5347\u7EA7\u6216\u8FC1\u79FB\u524D\u5907\u4EFD",output:"\u8F93\u51FA\u6587\u4EF6\u8DEF\u5F84\uFF08\u9ED8\u8BA4: architext-pack.xml\uFF09"},scaffold:{fallback:"\u672A\u627E\u5230 {lang} \u6A21\u677F\uFF0C\u56DE\u9000\u4F7F\u7528 'zh'",step_docs:"\u6B63\u5728\u521D\u59CB\u5316\u6587\u6863\u9AA8\u67B6...",step_rules:"\u6B63\u5728\u5B89\u88C5\u6838\u5FC3\u89C4\u5219...",step_ide:"\u6B63\u5728\u5206\u53D1 IDE \u89C4\u5219...",step_processing:"\u6B63\u5728\u5904\u7406 {group}...",complete:"\u811A\u624B\u67B6\u751F\u6210\u5B8C\u6210\u3002"},templates:{error:{root_not_found:"\u672A\u627E\u5230\u6A21\u677F\u76EE\u5F55\u3002\u5DF2\u641C\u7D22\u8DEF\u5F84: {paths}"}},command:{init:{title:"\u521D\u59CB\u5316 Architext \u6846\u67B6\uFF0C\u7528\u4E8E\u90E8\u7F72\u6807\u51C6\u5316\u7684 AI \u4E0A\u4E0B\u6587\u534F\u8BAE\u4E0E IDE \u89C4\u5219\u3002",select_editor:"\u8BF7\u9009\u62E9\u60A8\u7684\u76EE\u6807\u7F16\u8F91\u5668",select_lang:"\u8BF7\u9009\u62E9\u9879\u76EE\u6587\u6863\u8BED\u8A00",select_features:"\u8BF7\u9009\u62E9\u9879\u76EE\u7279\u5F81\uFF08\u53EF\u591A\u9009\uFF09",select_generate_brief:"\u662F\u5426\u751F\u6210 project-brief.md\uFF1F\uFF08\u751F\u6210\u540E\u586B\u5199\u9879\u76EE\u9700\u6C42\uFF0C\u4F9B /archi.start \u6216 /archi.inherit \u4F7F\u7528\uFF09",select_doc_dir:"\u8BF7\u8F93\u5165\u6587\u6863\u76EE\u5F55",config_exists:"\u68C0\u6D4B\u5230\u73B0\u6709\u914D\u7F6E\u6587\u4EF6 (architext.json)\u3002\u662F\u5426\u8986\u76D6\uFF1F",config_saved:"\u914D\u7F6E\u5DF2\u4FDD\u5B58\u5230 architext.json",conflict_title:"\u26A0\uFE0F \u68C0\u6D4B\u5230\u6587\u4EF6\u51B2\u7A81",conflict_msg:"\u4EE5\u4E0B\u6587\u4EF6\u5DF2\u5B58\u5728\uFF0C\u5C06\u5982\u4F55\u5904\u7406\uFF1F",conflict_more:" ... (\u8FD8\u6709 {count} \u4E2A\u6587\u4EF6)",conflict_overwrite:"\u8986\u76D6",conflict_skip:"\u8DF3\u8FC7",conflict_cancel:"\u53D6\u6D88",installing:"\u6B63\u5728\u590D\u5236\u6587\u4EF6...",cancel:"\u5DF2\u53D6\u6D88\u521D\u59CB\u5316",failed:"\u521D\u59CB\u5316\u5931\u8D25",success:"Architext \u521D\u59CB\u5316\u6210\u529F\uFF01 \u{1F680}"},uninstall:{desc:"\u79FB\u9664 Architext \u6846\u67B6\u53CA\u5176\u751F\u6210\u7684\u6587\u4EF6",title:"Architext \u5378\u8F7D\u5411\u5BFC",confirm_title:"\u26A0\uFE0F \u5371\u9669\u64CD\u4F5C\u8B66\u544A",confirm_msg:"\u6B64\u64CD\u4F5C\u5C06\u6C38\u4E45\u5220\u9664\u4EE5\u4E0B\u5185\u5BB9\uFF0C\u662F\u5426\u7EE7\u7EED\uFF1F",files_to_delete:"\u5C06\u5220\u9664\u7684\u6587\u4EF6/\u76EE\u5F55\uFF1A",done:"\u5378\u8F7D\u5B8C\u6210",success:"Architext \u5DF2\u6210\u529F\u79FB\u9664\u3002",error:"\u5378\u8F7D\u8FC7\u7A0B\u4E2D\u53D1\u751F\u9519\u8BEF\u3002",cancel:"\u5DF2\u53D6\u6D88\u5378\u8F7D\u3002",not_found:"\u672A\u627E\u5230\u914D\u7F6E\u6587\u4EF6 (architext.json)\uFF0C\u65E0\u6CD5\u81EA\u52A8\u5378\u8F7D\u3002",cleaning:"\u6B63\u5728\u6E05\u7406...",legacy_no_version:"\u5F53\u524D\u9879\u76EE\u4F7F\u7528\u65E7\u7248 Architext\uFF0C\u65E0\u6CD5\u81EA\u52A8\u5378\u8F7D\u3002",legacy_manual_hint:"\u8BF7\u624B\u52A8\u5220\u9664\u4EE5\u4E0B\u5185\u5BB9\uFF1A",legacy_exit:"\u8BF7\u624B\u52A8\u6E05\u7406\u540E\u91CD\u8BD5"},task:{check:{invalid_dep:"\u4EFB\u52A1 [{id}] \u7684\u4F9D\u8D56\u65E0\u6548: [{depId}] \u4E0D\u5B58\u5728\u4E8E\u4EFB\u52A1\u5217\u8868\u4E2D",consistent:"Roadmap \u4E00\u81F4\u6027\u68C0\u67E5\u901A\u8FC7\u3002"},update:{id_required:"\u66F4\u65B0\u72B6\u6001\u9700\u8981\u6307\u5B9A\u4EFB\u52A1 ID\u3002\u7528\u6CD5: architext task <id> --status <status>",updating:"\u6B63\u5728\u66F4\u65B0\u4EFB\u52A1 [{id}] \u72B6\u6001\u4E3A {status}...",done:"\u4EFB\u52A1 [{id}] -> {status}",unblocked:"\u4EFB\u52A1 [{id}] \u5DF2\u89E3\u9501 -> pending (\u6240\u6709\u4F9D\u8D56\u5DF2\u5B8C\u6210)"},list:{empty:"Roadmap \u4E2D\u672A\u627E\u5230\u4EFB\u52A1\u3002",title:"\u9879\u76EE Roadmap \u72B6\u6001"}},plan:{title:"Plan \u68C0\u67E5: {id} {name}",section_pass:"[{done}/{total}]",section_manual:"[{done}/{total}] (\u8DF3\u8FC7 \u2014 \u4EBA\u5DE5\u9A8C\u6536)",unchecked_item:" L{line}: {content}",total:"\u5408\u8BA1: {done}/{total} ({percent}%)",all_done:"\u6240\u6709\u81EA\u52A8\u5316\u4EFB\u52A1\u5DF2\u5B8C\u6210\uFF01",remaining:"\u5269\u4F59 {count} \u4E2A\u4EFB\u52A1\u672A\u5B8C\u6210",empty:"Plan \u6587\u4EF6\u4E2D\u6CA1\u6709 checkbox \u4EFB\u52A1",not_found:"\u672A\u627E\u5230 [{id}] \u7684\u5B9E\u73B0\u8BA1\u5212\u6587\u4EF6 (plan.json)"},template:{usage:"\u7528\u6CD5: npx archi template <name> \u53EF\u7528\u6A21\u677F:",unknown:'\u672A\u77E5\u6A21\u677F "{name}"\u3002\u53EF\u7528\u6A21\u677F: {available}',exists:"{path} \u5DF2\u5B58\u5728\uFF0C\u8DF3\u8FC7\u3002\u5982\u9700\u8986\u76D6\u8BF7\u5148\u5220\u9664\u3002",done:"\u5DF2\u751F\u6210 {path}\uFF0C\u586B\u5199\u540E\u8FD0\u884C /archi.scope \u5F00\u59CB\u5206\u89E3\u3002",not_found:"\u6A21\u677F\u6587\u4EF6 {name} \u672A\u627E\u5230\u3002\u8BF7\u5148\u8FD0\u884C npx archi init\u3002"},render:{empty:"\u672A\u627E\u5230\u53EF\u6E32\u67D3\u7684 JSON \u6570\u636E\u6587\u4EF6\u3002",done:"\u6E32\u67D3\u5B8C\u6210\uFF0C\u5171\u751F\u6210 {count} \u4E2A Markdown \u89C6\u56FE\u3002",plan:{header_comment:"<!-- \u26A0\uFE0F \u7531 plan.json \u81EA\u52A8\u751F\u6210 \u2014 \u8BF7\u52FF\u76F4\u63A5\u7F16\u8F91 -->",header_ai:"<!-- AI: \u8BF7\u8BFB\u53D6 plan.json \u800C\u975E\u6B64\u6587\u4EF6 -->",title:"\u5B9E\u65BD\u8BA1\u5212\uFF1A{featureName}",feature_id:"Task ID",status:"\u72B6\u6001",section_decisions:"\u6280\u672F\u51B3\u7B56",section_steps:"\u5B9E\u65BD\u6B65\u9AA4",section_tests:"\u6D4B\u8BD5\u8BA1\u5212",subsection_automated:"\u81EA\u52A8\u5316\u6D4B\u8BD5",subsection_manual:"\u4EBA\u5DE5\u9A8C\u6536"},roadmap:{header_comment:"<!-- \u26A0\uFE0F \u7531 roadmap.json \u81EA\u52A8\u751F\u6210 \u2014 \u8BF7\u52FF\u76F4\u63A5\u7F16\u8F91 -->",header_ai:"<!-- AI: \u8BF7\u8BFB\u53D6 roadmap.json \u800C\u975E\u6B64\u6587\u4EF6 -->",title:"\u9879\u76EE Roadmap",status:"\u72B6\u6001",updated:"\u66F4\u65B0\u4E8E",phase:"\u9636\u6BB5",goal:"\u76EE\u6807",dep:"\u4F9D\u8D56",dep_none:"\u65E0",tag:"\u6807\u7B7E",slug:"\u76EE\u5F55"}},update:{title:"Architext \u5347\u7EA7\u5411\u5BFC",no_config:"\u672A\u627E\u5230\u914D\u7F6E\u6587\u4EF6 (architext.json)\uFF0C\u8BF7\u5148\u8FD0\u884C npx archi init",cancel:"\u5DF2\u53D6\u6D88\u66F4\u65B0",success:"\u66F4\u65B0\u5B8C\u6210\uFF01",failed:"\u66F4\u65B0\u5931\u8D25",version_checking:"\u68C0\u67E5\u6700\u65B0\u7248\u672C...",version_check_skip:"\u7248\u672C\u68C0\u67E5\u5DF2\u8DF3\u8FC7\uFF08\u7F51\u7EDC\u4E0D\u53EF\u7528\uFF09",version_outdated:"\u53D1\u73B0\u65B0\u7248 v{latest}\uFF08\u5F53\u524D v{current}\uFF09",version_upgrade_hint:"\u5347\u7EA7\u547D\u4EE4: {cmd}",version_up_to_date:"\u5DF2\u662F\u6700\u65B0\u7248 v{version}",legacy_migration_blocked:"\u5F53\u524D\u9879\u76EE\u7F3A\u5C11\u7ED3\u6784\u7248\u672C\u4FE1\u606F\uFF0C\u4E0D\u652F\u6301\u81EA\u52A8\u66F4\u65B0\uFF0C\u8BF7\u6309\u4EE5\u4E0B\u6B65\u9AA4\u624B\u52A8\u8FC1\u79FB\uFF1A",legacy_migration_step1:" 1. npx archi pack \u5907\u4EFD\u6587\u6863\u6570\u636E",legacy_migration_step2:" 2. npx archi uninstall \u79FB\u9664\u65E7\u6846\u67B6\u6587\u4EF6\uFF08\u5982\u6709\u6B8B\u4F59\u8BF7\u624B\u52A8\u5220\u9664\uFF09",legacy_migration_step3:" 3. npx archi init \u91CD\u65B0\u521D\u59CB\u5316\u65B0\u7ED3\u6784",legacy_migration_step4:" 4. /archi.recover <pack\u6587\u4EF6> \u5728 AI \u4E2D\u8FD8\u539F\u6587\u6863\u6570\u636E",version_too_new:"\u9879\u76EE\u7ED3\u6784\u7248\u672C (v{project}) \u9AD8\u4E8E\u5F53\u524D CLI \u652F\u6301\u7684\u7248\u672C (v{cli})\uFF0C\u8BF7\u5148\u5347\u7EA7 CLI: npm install -g architext@latest",update_warning:"\u5C06\u5220\u9664\u65E7\u6846\u67B6\u6587\u4EF6\u5E76\u91CD\u65B0\u90E8\u7F72\u6700\u65B0\u7248\u672C\uFF1A",update_skip_hint:"\u4E0D\u89E6\u78B0: {list}",update_global_hint:"\u5168\u5C40\u6587\u6863\uFF08global/ \u4E0B\u7684 roadmap.json\u3001vision.md \u7B49\uFF09\u53EA\u589E\u4E0D\u51CF\uFF0C\u4E0D\u4F1A\u8986\u76D6\u5DF2\u6709\u5185\u5BB9",update_confirm:"\u786E\u8BA4\u6267\u884C\u66F4\u65B0\uFF1F",removing_old:"\u5220\u9664\u65E7\u6846\u67B6\u6587\u4EF6...",removed_old:"\u5DF2\u5220\u9664 {count} \u4E2A\u65E7\u6587\u4EF6",deploying_new:"\u90E8\u7F72\u65B0\u7248\u6846\u67B6\u6587\u4EF6...",deployed_new:"\u5DF2\u90E8\u7F72 {framework} \u4E2A\u6846\u67B6\u6587\u4EF6\uFF0C\u8865\u5145 {seeds} \u4E2A\u79CD\u5B50\u6587\u4EF6",schema_auditing:"Schema \u517C\u5BB9\u6027\u5BA1\u8BA1...",summary:"\u66F4\u65B0\u6C47\u603B",summary_framework:"\u5DF2\u5237\u65B0 {count} \u4E2A\u6846\u67B6\u6587\u4EF6\uFF08rules/prompts/skills/templates\uFF09",summary_seeds:"\u5DF2\u8865\u5145 {count} \u4E2A\u79CD\u5B50\u6587\u4EF6",summary_templated:"02_tech_stack \u542B\u9879\u76EE\u5B9A\u5236\uFF0C\u672A\u8986\u76D6\u3002\u65B0\u7248\u6A21\u677F\u5DF2\u5199\u5165 {docDir}/templates/02_tech_stack.template.md\uFF0C\u8BF7\u5BF9\u6BD4\u5E76\u624B\u52A8\u5408\u5E76\u5230\u4F60\u4F7F\u7528\u7684 IDE rules \u76EE\u5F55\uFF08\u5982 .cursor/rules/\u3001.windsurf/rules/\uFF09\u4E0B\u5BF9\u5E94\u6587\u4EF6",summary_skipped:"\u5DF2\u8DF3\u8FC7: {list}",summary_global:"\u5168\u5C40\u6587\u6863\uFF08global/\uFF09\u53EA\u589E\u4E0D\u51CF\uFF0C\u5982\u9700\u6E05\u7406\u8FC7\u65F6\u6587\u4EF6\u8BF7\u624B\u52A8\u5220\u9664",schema:{parse_error:"JSON \u89E3\u6790\u5931\u8D25\uFF0C\u6587\u4EF6\u53EF\u80FD\u5DF2\u635F\u574F",version_too_new:"\u6587\u4EF6\u7248\u672C (v{current}) \u9AD8\u4E8E CLI \u671F\u671B\u7248\u672C (v{expected})\uFF0C\u8BF7\u5148\u5347\u7EA7 CLI",roadmap_migrated:"{file}: \u5DF2\u4ECE v{from} \u8FC1\u79FB\u81F3 v{to}",roadmap_ok:"{file}: \u7ED3\u6784\u517C\u5BB9",roadmap_error:"{file}: \u7ED3\u6784\u4E0D\u517C\u5BB9",no_plans:"\u672A\u627E\u5230 plan.json \u6587\u4EF6\uFF0C\u8DF3\u8FC7\u5BA1\u8BA1",plans_ok:"\u6240\u6709 {count} \u4E2A plan.json \u7ED3\u6784\u517C\u5BB9",plan_error:"{file}: \u7ED3\u6784\u4E0D\u517C\u5BB9\uFF08\u8BF7\u624B\u52A8\u68C0\u67E5\uFF09"}},doctor:{title:"Architext \u9879\u76EE\u5065\u5EB7\u68C0\u67E5",no_config:"\u672A\u627E\u5230\u914D\u7F6E\u6587\u4EF6\uFF0C\u540E\u7EED\u68C0\u67E5\u5DF2\u8DF3\u8FC7",group:{config:"\u9879\u76EE\u914D\u7F6E",doc_structure:"\u6587\u6863\u76EE\u5F55\u7ED3\u6784",global_files:"\u5168\u5C40\u6587\u6863",ide_rules:"IDE \u6846\u67B6\u6587\u4EF6"},summary:{result:"\u7ED3\u679C: {parts}",passed:"{n} \u901A\u8FC7",warned:"{n} \u8B66\u544A",failed:"{n} \u5931\u8D25"},success:"\u9879\u76EE\u5065\u5EB7\u68C0\u67E5\u901A\u8FC7\uFF0C\u4E00\u5207\u6B63\u5E38",with_warnings:"\u68C0\u67E5\u5B8C\u6210\uFF0C\u5B58\u5728\u8B66\u544A\uFF0C\u5EFA\u8BAE\u5173\u6CE8",with_errors:"\u68C0\u67E5\u5B8C\u6210\uFF0C\u5B58\u5728\u95EE\u9898\uFF0C\u8BF7\u4FEE\u590D\u540E\u91CD\u8BD5",check:{config:{not_found:"\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728",hint_init:"\u8FD0\u884C npx archi init \u521D\u59CB\u5316\u9879\u76EE",format_label:"\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F",format_fail:"JSON \u89E3\u6790\u5931\u8D25\uFF0C\u6587\u4EF6\u53EF\u80FD\u5DF2\u635F\u574F",editors_label:"\u7F16\u8F91\u5668\u914D\u7F6E",editors_empty:"\u672A\u914D\u7F6E\u4EFB\u4F55\u7F16\u8F91\u5668",editors_invalid:"\u542B\u65E0\u6548\u7F16\u8F91\u5668: {list}",editors_ok:"\u7F16\u8F91\u5668: {list}",lang_label:"\u8BED\u8A00\u914D\u7F6E",lang_invalid:"\u4E0D\u652F\u6301\u7684\u8BED\u8A00: {lang}",lang_ok:"\u8BED\u8A00: {lang}",doc_dir:"\u6587\u6863\u76EE\u5F55: {dir}",doc_dir_unset:"(\u672A\u8BBE\u7F6E)",doc_dir_empty:"docDir \u5B57\u6BB5\u4E3A\u7A7A"},dir:{missing:"\u76EE\u5F55\u4E0D\u5B58\u5728",hint_init:"\u8FD0\u884C npx archi init \u91CD\u65B0\u521D\u59CB\u5316",hint_update:"\u8FD0\u884C npx archi update \u6062\u590D",hint_features:"\u624B\u52A8\u521B\u5EFA\u5373\u53EF\uFF1Amkdir {docDir}/tasks",hint_tasks:"\u624B\u52A8\u521B\u5EFA\u5373\u53EF\uFF1Amkdir {docDir}/tasks"},global:{required_missing:"\u5FC5\u8981\u6587\u6863\u7F3A\u5931",optional_missing:"\u6587\u6863\u7F3A\u5931\uFF08\u4E0D\u5F71\u54CD\u8FD0\u884C\uFF09",parse_fail:"JSON \u89E3\u6790\u5931\u8D25",roadmap_ok:"roadmap.json (Schema v{version} \u517C\u5BB9)",roadmap_hint:"\u8FD0\u884C npx archi update \u5C1D\u8BD5\u81EA\u52A8\u4FEE\u590D"},rules:{dir_missing:"\u89C4\u5219\u76EE\u5F55\u4E0D\u5B58\u5728",dir_hint:"\u8FD0\u884C npx archi update \u6062\u590D\u89C4\u5219\u6587\u4EF6",file_missing:"\u89C4\u5219\u6587\u4EF6\u7F3A\u5931",file_hint:"\u8FD0\u884C npx archi update \u6062\u590D"}}},pack:{title:"Architext Pack",no_config:"\u672A\u627E\u5230 .architext.json\uFF0C\u8BF7\u5148\u8FD0\u884C archi init",packing:"\u6B63\u5728\u6536\u96C6\u7528\u6237\u6570\u636E...",empty:"\u672A\u627E\u5230\u4EFB\u4F55\u7528\u6237\u6570\u636E\uFF0C\u8DF3\u8FC7\u6253\u5305",empty_hint:"\u5728 archi init \u4E4B\u540E\u3001\u586B\u5199\u6587\u6863\u4E4B\u524D\u8FD0\u884C pack \u65E0\u610F\u4E49",done:"\u5DF2\u6253\u5305 {count} \u4E2A\u6587\u4EF6 \u2192 {file}",hint_recover:"\u5347\u7EA7\u540E\u8FD8\u539F: /archi.recover {file}",success:"\u6253\u5305\u5B8C\u6210",failed:"\u6253\u5305\u5931\u8D25"},help:{tagline:"No Docs, No Code. \u2014 AI \u539F\u751F\u67B6\u6784\u534F\u8BAE",section:{ai:"AI Commands (\u5728 Chat \u4E2D\u4F7F\u7528)",cli:"CLI Commands (\u5728\u7EC8\u7AEF\u4E2D\u4F7F\u7528)",quick:"Quick Start (\u5FEB\u901F\u51B3\u7B56)",workflow:"Typical Workflow (\u5178\u578B\u5DE5\u4F5C\u6D41)"},ai:{start:{desc:"\u65B0\u9879\u76EE\u51B7\u542F\u52A8\u3002\u901A\u8FC7\u8BBF\u8C08\u786E\u7ACB\u613F\u666F\u3001\u6280\u672F\u6808\uFF0C\u751F\u6210\u6587\u6863\u9AA8\u67B6\u3002",detail:"\u4EA7\u51FA: Vision + Tech Stack + Roadmap + \u5168\u5C40\u6587\u6863\u9AA8\u67B6",example:"\u4F8B: /archi.start \u6211\u8981\u505A\u4E00\u4E2A Todo CLI \u5DE5\u5177\uFF0C\u7528 Rust \u5199"},inherit:{desc:"\u63A5\u7BA1\u65E7\u9879\u76EE\u3002\u5168\u91CF\u626B\u63CF\u4EE3\u7801\uFF0C\u9006\u5411\u63A8\u5BFC\u67B6\u6784\uFF0C\u586B\u5145\u5168\u5C40\u6587\u6863\u3002\u53EF\u9009\u63D0\u4F9B Brief \u8865\u5145\u613F\u666F/\u8DEF\u7EBF\u56FE\u3002",detail:"\u9002\u7528\u4E8E\u5DF2\u6709\u4EE3\u7801\u5E93\u4F46\u7F3A\u5C11 Architext \u6587\u6863\u7684\u9879\u76EE\uFF1B\u4EE3\u7801\u5E93\u5C1A\u7A7A\u65F6\u53EF\u4F20 project-brief.md",example:"\u4F8B: /archi.inherit project-brief.md"},scope:{desc:"\u9700\u6C42\u5206\u89E3\u3002\u8BFB\u53D6 Scope Brief\uFF0C\u5C06\u5927\u9700\u6C42\u62C6\u89E3\u4E3A\u591A\u4E2A Roadmap \u4EFB\u52A1\u5E76\u5EFA\u7ACB\u4F9D\u8D56\u5173\u7CFB\u3002",detail:"\u4EA7\u51FA: \u591A\u4E2A Roadmap \u4EFB\u52A1 (\u542B ID/\u76EE\u6807/\u4F9D\u8D56)\u3002\u65E0 Brief \u65F6\u81EA\u52A8\u8FDB\u5165\u8BBF\u8C08\u6A21\u5F0F",example:"\u4F8B: /archi.scope scope-brief.md"},plan:{desc:"\u529F\u80FD\u6DF1\u5EA6\u89C4\u5212\u3002\u5BF9 Roadmap \u4E2D\u5DF2\u6709\u4EFB\u52A1\u505A\u67B6\u6784\u8BBF\u8C08\uFF0C\u751F\u6210\u5B8C\u6574\u6587\u6863\u3002",detail:"\u4EA7\u51FA: Spec (\u529F\u80FD\u903B\u8F91) + UI (\u89C6\u89C9\u8BBE\u8BA1, \u5982\u9002\u7528) + Plan (\u5B9E\u65BD\u6B65\u9AA4)",example1:"\u4F8B: /archi.plan INF-001 \u9700\u8981\u652F\u6301 OAuth \u767B\u5F55",example2:"\u4F8B: /archi.plan FEAT-01"},code:{desc:"\u5C06\u6587\u6863\u7FFB\u8BD1\u4E3A\u4EE3\u7801\u3002\u8BFB\u53D6 Plan\uFF0C\u9010\u6B65\u5B9E\u73B0\uFF0C\u542B\u9759\u6001\u68C0\u67E5\u4E0E\u5BA1\u8BA1\u3002",detail:"\u524D\u7F6E: \u5BF9\u5E94 Task \u987B\u6709\u5B8C\u6574\u7684 Spec + Plan",example:"\u4F8B: /archi.code INF-001"},audit:{desc:"\u72EC\u7ACB\u6DF1\u5EA6\u4EE3\u7801\u5BA1\u67E5\u3002\u627E Bug\u3001\u627E\u7F3A\u6F0F\u3001\u67E5\u5408\u89C4\u3002",detail:"\u5E26 ID: \u5BA1\u67E5\u6307\u5B9A\u4EFB\u52A1\u7684\u4EE3\u7801\u5B9E\u73B0 | \u65E0 ID: \u9879\u76EE\u7EA7\u5065\u5EB7\u4F53\u68C0",example1:"\u4F8B: /archi.audit INF-001",example2:"\u4F8B: /archi.audit"},fix:{desc:"\u4FEE\u590D Bug\uFF08\u975E\u9700\u6C42\u53D8\u66F4\uFF09\u3002\u8BCA\u65AD\u9519\u8BEF\u5E76\u4FEE\u590D\u4EE3\u7801\uFF0C\u901A\u5E38\u4E0D\u6539 Spec\u3002",detail:"\u81EA\u52A8\u8BB0\u5F55\u4FEE\u590D\u8FC7\u7A0B\u5230 Plan\uFF0C\u4FDD\u6301\u6587\u6863\u4E00\u81F4\u6027",example:"\u4F8B: /archi.fix INF-001 \u767B\u5F55\u65F6\u62A5 403 \u9519\u8BEF"},edit:{desc:"\u5C40\u90E8\u9700\u6C42\u53D8\u66F4\u3002\u5148\u6539 Spec/UI \u6587\u6863\uFF0C\u518D\u540C\u6B65\u4FEE\u6539\u4EE3\u7801\u3002",detail:"\u53D8\u66F4\u94FE\u8DEF: \u66F4\u65B0 Spec/UI --> \u8FFD\u52A0 Plan \u6B65\u9AA4 --> \u4FEE\u6539\u4EE3\u7801",example:"\u4F8B: /archi.edit INF-001 \u589E\u52A0\u8BB0\u4F4F\u5BC6\u7801\u529F\u80FD"},revise:{desc:"\u5168\u5C40\u53D8\u66F4\uFF08\u6280\u672F\u6808\u3001\u67B6\u6784\u7B49\uFF09\u3002\u5206\u6790\u5F71\u54CD\u8303\u56F4\uFF0C\u7ECF\u786E\u8BA4\u540E\u7EA7\u8054\u66F4\u65B0\u76F8\u5173 Task\u3002",detail:"\u5F71\u54CD\u8303\u56F4: Vision / Tech Stack / Roadmap / \u76F8\u5173 Task \u6587\u6863",example:"\u4F8B: /archi.revise \u4ECE REST \u8FC1\u79FB\u5230 GraphQL"},map:{desc:"\u5237\u65B0\u67B6\u6784\u5730\u56FE\u3002\u91CD\u65B0\u626B\u63CF\u76EE\u5F55\u6811\uFF0C\u66F4\u65B0 map.json\u3002",detail:"\u5F53\u76EE\u5F55\u7ED3\u6784\u53D1\u751F\u53D8\u5316\u65F6\u4F7F\u7528\uFF0C\u4FDD\u6301 map.json \u4E0E\u5B9E\u9645\u6587\u4EF6\u7CFB\u7EDF\u540C\u6B65"},remove:{desc:"\u7279\u6027\u4E0B\u7EBF\u3002\u5168\u94FE\u8DEF\u6E05\u9664\uFF1A\u5F71\u54CD\u5206\u6790 \u2192 \u5220\u9664\u6587\u6863+\u4EE3\u7801 \u2192 \u6E05\u7406\u5168\u5C40\u5F15\u7528\u3002",detail:"\u6E05\u7406\u8303\u56F4: Task \u6587\u6863 / \u4E1A\u52A1\u4EE3\u7801 / roadmap / map / context_glue",example:"\u4F8B: /archi.remove FEAT-003"},help:{desc:"\u9879\u76EE\u5BFC\u822A\u4E0E\u4E0A\u4E0B\u6587\u95EE\u7B54\u3002\u5206\u6790\u9879\u76EE\u72B6\u6001\uFF0C\u5EFA\u8BAE\u4E0B\u4E00\u6B65\u64CD\u4F5C\u3002",detail:"\u65E0\u53C2\u6570\u65F6\u667A\u80FD\u63A8\u8350\u4E0B\u4E00\u6B65\uFF1B\u5E26\u95EE\u9898\u65F6\u57FA\u4E8E\u9879\u76EE\u4E0A\u4E0B\u6587\u56DE\u7B54",example1:"\u4F8B: /archi.help",example2:"\u4F8B: /archi.help \u8FD9\u4E2A\u9879\u76EE\u7684\u6570\u636E\u6A21\u578B\u957F\u4EC0\u4E48\u6837\uFF1F"}},cli:{init:{desc:"\u521D\u59CB\u5316 Architext \u6846\u67B6\u3002\u751F\u6210\u89C4\u5219\u6587\u4EF6\u3001\u6587\u6863\u76EE\u5F55\u3001Prompt \u6A21\u677F\u3002\u53EF\u9009\u751F\u6210 project-brief.md\uFF08\u751F\u6210\u540E\u586B\u5199\u9879\u76EE\u9700\u6C42\uFF0C\u4F9B /archi.start \u6216 /archi.inherit \u4F7F\u7528\uFF09\u3002",editor:"\u6307\u5B9A IDE (cursor / trae / windsurf / vscode / claude / opencode)",lang:"\u6307\u5B9A\u8BED\u8A00 (zh / en)",doc:"\u81EA\u5B9A\u4E49\u6587\u6863\u76EE\u5F55\u540D (\u9ED8\u8BA4 .architext)",type:"\u9879\u76EE\u7279\u5F81\uFF0C\u9017\u53F7\u5206\u9694 (ui,data,api,cli,lib,mobile,desktop,miniapp,extension,realtime,ai)"},update:{desc:"\u540C\u6B65\u6700\u65B0\u89C4\u5219\u6A21\u677F\u5230\u9879\u76EE\uFF0C\u4FDD\u6301\u89C4\u5219\u6587\u4EF6\u4E0E\u6846\u67B6\u7248\u672C\u4E00\u81F4\u3002",dry_run:"\u4EC5\u9884\u89C8\u53D8\u66F4\uFF0C\u4E0D\u5B9E\u9645\u5199\u5165"},doctor:{desc:"\u53EA\u8BFB\u5065\u5EB7\u626B\u63CF\uFF1A\u914D\u7F6E\u6709\u6548\u6027\u3001\u76EE\u5F55\u5B8C\u6574\u6027\u3001\u5168\u5C40\u6587\u6863 Schema\u3001IDE \u89C4\u5219\u6587\u4EF6\u3002"},task:{desc:"\u7BA1\u7406 Roadmap \u4EFB\u52A1\u3002\u67E5\u770B\u8FDB\u5EA6\u3001\u66F4\u65B0\u72B6\u6001\u3001\u68C0\u67E5\u4F9D\u8D56\u4E00\u81F4\u6027\u3002",detail:"\u65E0\u53C2\u6570: \u5217\u51FA\u6240\u6709\u4EFB\u52A1 | --check: \u68C0\u67E5\u4F9D\u8D56\u4E00\u81F4\u6027",example:"\u4F8B: npx archi task INF-001 --status done"},plan:{desc:"\u68C0\u67E5\u6307\u5B9A Task \u7684 Plan \u5B8C\u6210\u5EA6\uFF08\u81EA\u52A8\u8BC6\u522B\u4EBA\u5DE5\u9A8C\u6536\u533A\u57DF\uFF09\u3002",example:"\u4F8B: npx archi plan INF-001"},render:{desc:"\u5C06 JSON \u6570\u636E\u6587\u4EF6 (roadmap/plan) \u6E32\u67D3\u4E3A\u4EBA\u7C7B\u53EF\u8BFB\u7684 Markdown \u89C6\u56FE\u3002"},template:{desc:"\u83B7\u53D6\u6A21\u677F\u6587\u4EF6\u5230\u9879\u76EE\u6839\u76EE\u5F55\u4F9B\u586B\u5199\u3002",example:"\u4F8B: npx archi template scope-brief"},uninstall:{desc:"\u79FB\u9664 Architext \u6846\u67B6\u53CA\u5176\u751F\u6210\u7684\u6240\u6709\u6587\u4EF6\uFF08\u89C4\u5219\u3001\u6587\u6863\u3001\u914D\u7F6E\uFF09\u3002"}},quick:{new_project:"\u65B0\u9879\u76EE\u4ECE\u96F6\u5F00\u59CB",legacy:"\u63A5\u7BA1\u65E7\u9879\u76EE",new_feature:"\u89C4\u5212\u65B0\u4EFB\u52A1",write_code:"\u5B9E\u73B0\u4EE3\u7801",fix_bug:"\u4FEE\u590D Bug",check_health:"\u68C0\u67E5\u9879\u76EE\u5065\u5EB7"},workflow:{init_flow:"\u9996\u6B21\u542F\u52A8:",new_feature:"\u65B0\u589E\u4EFB\u52A1:",change_spec:"\u9700\u6C42\u53D8\u66F4:",standalone:"\u72EC\u7ACB\u64CD\u4F5C:"}}}};var ft={zh:At,en:Ot};function ve(e,t){if(e)return t.split(".").reduce((o,i)=>{if(o!=null&&typeof o=="object")return o[i]},e)}function _(){let e=process.env.ARCHITEXT_LANG;return e&&(e==="zh"||e==="en")?e:new Intl.DateTimeFormat().resolvedOptions().locale.startsWith("zh")?"zh":"en"}function h(e="zh",t){let o=ft[e]||ft.zh,i=ft.en,r=t?ve(o,t):o,s=t?ve(i,t):i;return(c,n)=>{let a;return t?a=ve(r,c)||ve(s,c):a=ve(o,c)||ve(i,c),a?n?String(a).replace(/\{(\w+)\}/g,(p,d)=>n[d]!==void 0?String(n[d]):p):String(a):c}}import Z from"fs-extra";import Q from"path";import{readFileSync as rr}from"fs";import ir from"path";var F={DEFAULT_DOC_DIR:".architext",PATHS:{DOCS_SOURCE:"docs",RULES_SOURCE:"rules",RULES_TARGET:"rules",PROMPTS_SOURCE:"docs/prompts",BRIEFS_SOURCE:"briefs",SKILLS_SOURCE:"skills",SKILLS_DOC_TARGET:"skills"},PLACEHOLDERS:{DOCS_DIR:"[[__DOCS_DIR__]]",PROJECT_TYPE:"[[__PROJECT_TYPE__]]",PROMPTS_PATH:"[[__PROMPTS_PATH__]]"}},gt={zh:{label:"\u4E2D\u6587"},en:{label:"English"}},E={cursor:{label:"Cursor",targetDir:".cursor/rules",targetExt:".mdc",commands:{targetDir:".cursor/commands"},skills:{targetDir:".cursor/skills"},subagents:!0},windsurf:{label:"Windsurf",targetDir:".windsurf/rules",targetExt:".md",skills:{targetDir:".windsurf/skills"}},trae:{label:"Trae",targetDir:".trae/rules",targetExt:".md",skills:{targetDir:".trae/skills"},subagents:!0},vscode:{label:"VS Code",targetDir:".github/instructions",targetExt:".instructions.md",skills:{targetDir:".github/skills"},subagents:!0},claude:{label:"Claude Code",targetDir:".claude/rules",targetExt:".md",commands:{targetDir:".claude/commands"},skills:{targetDir:".claude/skills"},subagents:!0},opencode:{label:"OpenCode",targetDir:".opencode/rules",targetExt:".md",commands:{targetDir:".opencode/commands"},skills:{targetDir:".opencode/skills"},subagents:!0}},fe=Object.keys(E);function It(e,t){let o=E[e];return o?.commands?o.commands.targetDir:`${t}/prompts/${e}`}var ht=[{value:"ui",label:"ui",hint:"\u6709\u7528\u6237\u754C\u9762\uFF08Web/\u79FB\u52A8\u7AEF/\u684C\u9762\u7AEF/\u5C0F\u7A0B\u5E8F\uFF09"},{value:"data",label:"data",hint:"\u6709\u6570\u636E\u5C42\uFF08\u6570\u636E\u5E93/ORM/\u672C\u5730\u5B58\u50A8\uFF09"},{value:"api",label:"api",hint:"\u6709 HTTP/RPC/GraphQL \u63A5\u53E3"},{value:"cli",label:"cli",hint:"\u6709\u547D\u4EE4\u884C\u5165\u53E3"},{value:"lib",label:"lib",hint:"\u4F5C\u4E3A\u5E93/SDK/NPM \u5305\u53D1\u5E03"},{value:"mobile",label:"mobile",hint:"\u79FB\u52A8\u7AEF\uFF08RN/Flutter/Expo\uFF09"},{value:"desktop",label:"desktop",hint:"\u684C\u9762\u7AEF\uFF08Electron/Tauri\uFF09"},{value:"miniapp",label:"miniapp",hint:"\u5C0F\u7A0B\u5E8F\uFF08\u5FAE\u4FE1/\u652F\u4ED8\u5B9D/uni-app\uFF09"},{value:"extension",label:"extension",hint:"\u6D4F\u89C8\u5668\u6269\u5C55\uFF08Chrome/Firefox\uFF09"},{value:"realtime",label:"realtime",hint:"\u5B9E\u65F6/WebSocket/\u534F\u4F5C"},{value:"ai",label:"ai",hint:"AI Agent / MCP"}],We={"scope-brief":{file:"scope-brief.template.md",output:"scope-brief.md"}},$t="_base.md",Ft="_modules.md",Lt="project-brief.md",Ye="brief-assets";function Ie(e,t,o){return o&&(e=e.replace(/\[\[INCLUDE: ([^\]]+)\]\]/g,(i,r)=>{let s=ir.join(o,r.trim());try{return rr(s,"utf-8").trim()}catch{return`<!-- INCLUDE NOT FOUND: ${r.trim()} -->`}})),e=e.replace(/\[\[SUBAGENT: ([^|]+)\|(.+?)\]\]/g,(i,r,s)=>{let c=r.trim(),n=s.trim();return t.hasSubagents?`**[\u5B50\u4EE3\u7406]** \u542F\u52A8\u72EC\u7ACB\u5B50\u4EE3\u7406\u6267\u884C\u4EE5\u4E0B\u5BA1\u67E5\uFF08\u7981\u5728\u5F53\u524D\u4E0A\u4E0B\u6587\u5185\u8054\u6267\u884C\uFF09\u3002\u5B50\u4EE3\u7406\u8BFB\u53D6 \`skills/${c}/SKILL.md\` \u4F5C\u4E3A\u6267\u884C\u6307\u4EE4\uFF0C\u5728\u5168\u65B0\u4E0A\u4E0B\u6587\u4E2D\u8FD0\u884C\uFF0C\u5B8C\u6210\u540E\u5C06\u7ED3\u679C\u8FD4\u56DE\u5F53\u524D\u6D41\u7A0B\u3002\u53C2\u6570\uFF1A${n}`:t.hasSkills?`\u8BF7\u8BFB\u53D6 Skill \`skills/${c}/SKILL.md\` \u5E76\u5728\u5F53\u524D\u4E0A\u4E0B\u6587\u4E2D\u6309\u5176\u6307\u4EE4\u6267\u884C\u3002\u53C2\u6570\uFF1A${n}`:""}),e=e.replace(/\[\[SKILL: ([^|]+)\|(.+?)\]\]/g,(i,r,s)=>t.hasSkills?`\u8BF7\u4F7F\u7528 Skill \u5DE5\u5177\u8C03\u7528 \`${r.trim()}\`\uFF0C\u53C2\u6570\uFF1A${s.trim()}`:""),e=e.replace(/\[\[NO-SKILL: ([^\]]+)\]\]/g,(i,r)=>t.hasSkills?"":r),e}var sr=[{version:1,rules:["00_system","01_workflow","02_tech_stack","03_data_governance","04_cli_tools","90_custom_rules","99_context_glue"],prompts:["start","inherit","scope","plan","code","edit","revise","audit","fix","map","remove","help","recover","ref"],skills:["archi-data-sync","archi-decompose-roadmap","archi-design-patterns","archi-feature-relations","archi-interview-protocol","archi-plan-options","archi-silent-audit","archi-ui-wireframe"],docTemplates:["design.template.md","plan.template.json","scope-brief.template.md","spec.template.md","ui.template.md"],globalSeeds:["dictionary.json","error_codes.json","map.json","roadmap.json","vision.md",{file:"api_snapshot.json",feature:"api"},{file:"command_api.json",feature:"cli"},{file:"data_snapshot.json",feature:"data"},{file:"design_tokens.json",feature:"ui"},{file:"env_registry.json",feature:"api"},{file:"public_api.json",feature:"lib"}],rulePolicy:{"02_tech_stack":"templateOnly","90_custom_rules":"neverTouch"}}],ie=1;function nr(e){return sr.find(t=>t.version===e)}function M(){let e=nr(ie);if(!e)throw new Error(`FileModel version ${ie} not found in registry`);return e}function Y(e){return e.replace(/\\/g,"/")}function De(e,t){let o=[],i=[],r=[],s=new Set(t.features??[]);for(let a of t.editors){let p=E[a];if(p){for(let d of e.rules)o.push(Y(`${p.targetDir}/${d}${p.targetExt}`));for(let d of e.prompts)p.commands?o.push(Y(`${p.commands.targetDir}/archi.${d}.md`)):o.push(Y(`${t.docDir}/prompts/${a}/archi.${d}.md`));if(p.skills)for(let d of e.skills)i.push(Y(`${p.skills.targetDir}/${d}`))}}if(t.editors.some(a=>!E[a]?.skills))for(let a of e.skills)i.push(Y(`${t.docDir}/skills/${a}`));for(let a of e.docTemplates)o.push(Y(`${t.docDir}/templates/${a}`));for(let a of e.globalSeeds)typeof a=="string"?r.push(Y(`${t.docDir}/global/${a}`)):s.has(a.feature)&&r.push(Y(`${t.docDir}/global/${a.file}`));let n=[Y(`${t.docDir}/tasks`),Y(`${t.docDir}/refs`),Y(`${t.docDir}/scripts`)];return{frameworkFiles:o,frameworkDirs:i,seedFiles:r,scaffoldDirs:n}}function Ze(e,t){return De(e,{editors:fe,docDir:t,features:[]})}import{ZodError as fr}from"zod";var b=class extends Error{code;isUserError;constructor(t,o="INTERNAL_ERROR",i=!1){super(t),this.name="AppError",this.code=o,this.isUserError=i}},se=class extends b{constructor(t="Operation cancelled"){super(t,"USER_CANCEL",!0)}};var $e=class extends b{constructor(t){super(t,"CONFIG_PARSE_ERROR",!0)}},Qe=class extends b{constructor(){super("Roadmap file not found. Please create 'roadmap.json' or configure 'roadmap' in architext.json","ROADMAP_NOT_FOUND",!0)}},Xe=class extends b{constructor(t){super(`Task [${t}] not found.`,"TASK_NOT_FOUND",!0)}},et=class extends b{constructor(t){super(`Invalid status: '${t}'. Valid values: pending, active, done, blocked`,"INVALID_TASK_STATUS",!0)}},ge=class extends b{constructor(t){super(`Plan file not found for task [${t}]. Expected at: {docDir}/tasks/${t}_*/plan.json`,"PLAN_NOT_FOUND",!0)}},tt=class extends b{issues;constructor(t){super(`Roadmap has ${t.length} inconsistencies.`,"ROADMAP_INCONSISTENCY",!0),this.issues=t}};import{z as L}from"zod";var Nt=L.enum(["pending","active","done","blocked"]),Ut=L.object({id:L.string().min(1),title:L.string().min(1),status:Nt,goal:L.string().optional(),deps:L.array(L.string()).optional(),tag:L.string().optional(),slug:L.string().optional()}),ar=L.object({id:L.string().min(1),name:L.string().min(1),tasks:L.array(Ut)}),X=L.object({version:L.number(),projectStatus:L.string(),lastUpdated:L.string(),phases:L.array(ar)});import{z as R}from"zod";var kt=R.object({id:R.string().min(1),title:R.string().min(1),notes:R.string().optional(),done:R.boolean()}),cr=R.object({name:R.string().min(1),tasks:R.array(kt)}),lr=R.object({category:R.string(),choice:R.string(),rationale:R.string().optional()}),pr=R.object({automated:R.array(kt),manual:R.array(kt)}),he=R.object({featureId:R.string().min(1),featureName:R.string().min(1),status:R.string(),decisions:R.array(lr),phases:R.array(cr),tests:pr});import{z as T}from"zod";var ot=T.record(T.string(),T.unknown()),Mt=T.object({entities:T.array(ot),verbs:T.array(ot)}).catchall(T.unknown()),Gt=T.object({businessErrors:T.array(ot)}).catchall(T.unknown()),Vt=T.object({models:T.array(ot)}).catchall(T.unknown()),Bt=T.object({semanticTokens:T.record(T.string(),T.unknown())}).catchall(T.unknown()),zt=T.object({governance:T.record(T.string(),T.unknown())}).catchall(T.unknown()),rt={"dictionary.json":Mt,"error_codes.json":Gt,"data_snapshot.json":Vt,"design_tokens.json":Bt,"map.json":zt};import{z as K}from"zod";var dr=K.enum(["trae","cursor","windsurf","vscode","claude","opencode"]),mr=K.enum(["ui","data","cli","lib","api","mobile","desktop","extension","miniapp","realtime","ai"]),ur=K.enum(["zh","en"]),_t=K.object({language:ur,docDir:K.string().min(1),features:K.array(mr).optional(),roadmap:K.string().optional(),editors:K.array(dr).min(1),version:K.string().optional(),structureVersion:K.number().int().positive().optional(),updatedAt:K.string().min(1),opencodeInstructionsAdded:K.boolean().optional()});function ke(e,t,o){try{return e.parse(t)}catch(i){if(i instanceof fr){let r=i.issues.map(s=>` - ${s.path.join(".")}: ${s.message}`).join(`
|
|
3
|
-
`);throw new
|
|
4
|
-
${r}`,"SCHEMA_VALIDATION_ERROR",!0)}throw i}}var y=
|
|
5
|
-
${
|
|
6
|
-
${
|
|
7
|
-
`);return`${
|
|
8
|
-
${t}`}async function
|
|
9
|
-
`)),
|
|
2
|
+
import{cac as Fr}from"cac";var pe={name:"architext",version:"0.0.6",description:"The DDAD (Document-Driven AI Development) protocol and prompt scaffolder for AI-native engineering.",type:"module",scripts:{build:"tsup",dev:"tsx src/index.ts",lint:"eslint . && prettier --check .",test:"vitest","test:ui":"vitest --ui","test:coverage":"vitest --coverage","test:run":"vitest run",prepublishOnly:"npm run build",prepare:"husky"},"lint-staged":{ignore:["website/.astro/**"],"*.{js,ts,tsx,jsx}":["eslint --fix","prettier --write"],"*.{json,md}":["prettier --write"]},files:["dist","README.md","README.zh-CN.md","CHANGELOG.md","LICENSE"],bin:{architext:"./dist/index.js",archi:"./dist/index.js"},keywords:["architext","ddad","document-driven","ai","llm","prompt-engineering","scaffold","cli","architecture","spec","template","code-generation"],author:"JiuNian3219 <qin0yu0lou@gmail.com>",license:"MIT",devDependencies:{"@commitlint/cli":"^20.3.1","@commitlint/config-angular":"^20.3.1","@eslint/js":"^9.39.2","@types/fs-extra":"^11.0.4","@types/node":"^25.2.1","@types/node-notifier":"^8.0.5","@vitest/coverage-v8":"^4.0.18","@vitest/ui":"^4.0.18",eslint:"^9.39.2","eslint-config-prettier":"^10.1.8",globals:"^17.1.0",husky:"^9.1.7","lint-staged":"^16.2.7","mock-fs":"^5.5.0",prettier:"^3.8.1",tsup:"^8.5.1",tsx:"^4.21.0",typescript:"^5.9.3","typescript-eslint":"^8.53.1",vitest:"^4.0.18"},dependencies:{"@clack/prompts":"^0.11.0",cac:"^6.7.14",chalk:"^5.6.2","fs-extra":"^11.3.3","node-notifier":"^10.0.1",picocolors:"^1.1.1",zod:"^4.3.6"}};import{intro as Di,outro as pt}from"@clack/prompts";import N from"picocolors";import de from"picocolors";var l={info:e=>console.log(de.cyan(e)),success:e=>console.log(de.green(e)),warn:e=>console.warn(de.yellow(e)),error:e=>console.error(de.red(e)),dim:e=>console.log(de.dim(e)),step:e=>console.log(de.cyan(`\u27A4 ${e}`)),done:e=>console.log(de.green(`\u2714 ${e}`)),fail:e=>console.error(de.red(`\u2716 ${e}`)),raw:e=>console.log(e),clear:()=>console.clear()};var Ut={common:{coming_soon:"\u{1F6A7} This feature is coming soon, stay tuned!",error:{unexpected:"\u274C Unexpected Error: {msg}",unknown:"\u274C Unknown error occurred",internal:"\u274C Internal Error [{code}]: {msg}",cancel:"\u{1F6AB} {msg}"}},init:{desc:"Initialize Architext Framework, configure editor rules and document skeleton",editor:"Target IDE, multiple selection is supported, separated by commas (cursor/windsurf/trae/vscode/claude/opencode)",lang:"Rules and document skeleton language",doc:"Custom document path, default is .architext",type:"Project features, comma-separated (ui,data,api,cli,lib,mobile,desktop,miniapp,extension,realtime,ai)",yes:"Skip all confirmation prompts (auto-confirm overwrite)",brief:"Generate project-brief.md (use with -y to skip interaction)",notify:"Enable desktop notifications (default: on)",noNotify:"Disable desktop notifications",failed:"Initialization failed"},update:{desc:"Sync latest rules, update editor rules and document skeleton",failed:"Update failed",version_gap_warning:"Project structure (v{project}) is far behind CLI (v{current}). Auto-update may be incomplete. Consider: 1) Run npx archi pack to backup; 2) Use AI to help merge pack output; 3) Or re-run npx archi init (loses customizations)",dry_run_msg:"\u{1F50D} Dry run mode enabled.",construction:"Update feature is under construction..."},uninstall:{desc:"Remove Architext framework and generated files"},doctor:{desc:"Project health check: config, doc structure, global files and IDE rules",failed:"System check failed",success:"System Check: All Good"},task:{desc:"Manage project roadmap tasks",status:"Update task status (pending|active|done|blocked)",check:"Check roadmap consistency"},plan:{desc:"Check implementation plan (plan.json) completion status",id_required:"Please specify Task ID (e.g.: archi plan SUB-01)"},render:{desc:"Render JSON data files into Markdown views"},template:{desc:"Fetch template files to project root"},help:{desc:"Display Architext command help information"},pack:{desc:"Pack user data (docs, tasks, custom rules) for backup before upgrade or migration",output:"Output file path (default: architext-pack.xml)"},notify:{desc:"Send desktop notification (for IDE hooks)",title:"Architext",defaultMessage:"Awaiting next instruction"},scaffold:{fallback:"Template for {lang} not found, falling back to 'zh'",step_docs:"Scaffolding documentation structure...",step_rules:"Installing core rules...",step_ide:"Distributing IDE rules...",step_processing:"Processing {group}...",complete:"Scaffold complete."},templates:{error:{root_not_found:"Templates directory not found. Searched in: {paths}"}},command:{init:{title:"Initialize Architext Framework for deploying standardized AI context protocols & IDE rules.",select_editor:"Select target editors",select_lang:"Select documentation language",select_features:"Select project features (multi-select)",select_generate_brief:"Generate project-brief.md at project root? (Fill in project requirements for /archi.start or /archi.inherit)",select_doc_dir:"Enter documentation directory",config_exists:"Existing config (architext.json) detected. Overwrite?",config_saved:"Config saved to architext.json",conflict_title:"\u26A0\uFE0F File Conflict Detected",conflict_msg:"The following files already exist. How to proceed?",conflict_more:" ... ({count} more files)",conflict_overwrite:"Overwrite",conflict_skip:"Skip",conflict_cancel:"Cancel",installing:"Copying files...",cancel:"Initialization cancelled",failed:"Initialization failed",success:"Architext initialized successfully! \u{1F680}"},uninstall:{desc:"Remove Architext framework and generated files",title:"Architext Uninstall Wizard",confirm_title:"\u26A0\uFE0F Danger Zone",confirm_msg:"This will PERMANENTLY delete the following. Continue?",files_to_delete:"Files/Directories to be deleted:",done:"Uninstall done",success:"Architext successfully removed.",error:"Uninstall error occurred.",cancel:"Uninstall cancelled.",not_found:"Configuration (architext.json) not found. Cannot auto-uninstall.",cleaning:"Cleaning up...",legacy_no_version:"This project uses an older version of Architext and cannot be auto-uninstalled.",legacy_manual_hint:"Please manually delete the following:",legacy_exit:"Please clean up manually and try again"},task:{check:{invalid_dep:"Task [{id}] has invalid dependency: [{depId}] does not exist in task list",consistent:"Roadmap is consistent."},update:{id_required:"Task ID is required for status update. Usage: architext task <id> --status <status>",updating:"Updating task [{id}] to {status}...",done:"Task [{id}] -> {status}",unblocked:"Task [{id}] unblocked -> pending (all deps done)"},list:{empty:"No tasks found in roadmap.",title:"Project Roadmap Status"}},plan:{title:"Plan Check: {id} {name}",section_pass:"[{done}/{total}]",section_manual:"[{done}/{total}] (skipped \u2014 manual verification)",unchecked_item:" L{line}: {content}",total:"Total: {done}/{total} ({percent}%)",all_done:"All automated tasks complete!",remaining:"{count} tasks remaining",empty:"No checkbox tasks found in plan file",not_found:"Plan file not found for [{id}] (plan.json)"},template:{usage:"Usage: npx archi template <name> Available templates:",unknown:'Unknown template "{name}". Available: {available}',exists:"{path} already exists, skipped. Delete it first to regenerate.",done:"Generated {path}. Fill it in and run /archi.scope to start decomposition.",not_found:"Template file {name} not found. Run npx archi init first."},render:{empty:"No JSON data files found to render.",done:"Render complete. Generated {count} Markdown view(s).",plan:{header_comment:"<!-- \u26A0\uFE0F AUTO-GENERATED from plan.json \u2014 DO NOT EDIT DIRECTLY -->",header_ai:"<!-- AI: Read plan.json, not this file -->",title:"Implementation Plan: {featureName}",feature_id:"Task ID",status:"Status",section_decisions:"Technical Decisions",section_steps:"Implementation Steps",section_tests:"Test Plan",subsection_automated:"Automated Tests",subsection_manual:"Manual Verification"},roadmap:{header_comment:"<!-- \u26A0\uFE0F AUTO-GENERATED from roadmap.json \u2014 DO NOT EDIT DIRECTLY -->",header_ai:"<!-- AI: Read roadmap.json, not this file -->",title:"Project Roadmap",status:"Status",updated:"Updated",phase:"Phase",goal:"Goal",dep:"Dep",dep_none:"None",tag:"Tag",slug:"Slug"}},update:{title:"Architext Update Wizard",no_config:"No config file (architext.json) found. Please run npx archi init first.",cancel:"Update cancelled",success:"Update complete!",failed:"Update failed",version_checking:"Checking latest version...",version_check_skip:"Version check skipped (network unavailable)",version_outdated:"New version v{latest} available (current: v{current})",version_upgrade_hint:"Upgrade command: {cmd}",version_up_to_date:"Already up to date: v{version}",legacy_migration_blocked:"Project is missing structure version info. Auto-update is not supported. Please migrate manually:",legacy_migration_step1:" 1. npx archi pack Back up your document data",legacy_migration_step2:" 2. npx archi uninstall Remove old framework files (delete any leftovers manually)",legacy_migration_step3:" 3. npx archi init Re-initialize with the new structure",legacy_migration_step4:" 4. /archi.recover <pack-file> Restore your document data in AI",version_too_new:"Project structure version (v{project}) is newer than CLI supports (v{cli}). Please upgrade: npm install -g architext@latest",update_warning:"Old framework files will be removed and the latest version will be redeployed:",update_skip_hint:"Won't touch: {list}",update_global_hint:"Global docs (roadmap.json, vision.md, etc. in global/) are add-only \u2014 existing files won't be overwritten",update_confirm:"Confirm update?",removing_old:"Removing old framework files...",removed_old:"Removed {count} old files",deploying_new:"Deploying new framework files...",deployed_new:"Deployed {framework} framework files, added {seeds} seed files",migrating_structure:"Running v{fromVersion} \u2192 v{toVersion} structure migration...",migrated_structure:"Migration complete, {count} changes applied",migration_warn:"Non-fatal error during migration, skipped",migration_nothing:"Nothing to migrate (already up to date)",migration_partial:"Partial migration failed, completed {done} changes",migration_chain_broken:"Migration chain broken: {error}",schema_auditing:"Running Schema compatibility audit...",summary:"Update Summary",summary_framework:"Refreshed {count} framework files (rules/prompts/skills/templates)",summary_seeds:"Added {count} seed files",summary_templated:"02_tech_stack has project customizations, not overwritten. New template saved to {docDir}/templates/02_tech_stack.template.md \u2014 compare and merge into your IDE rules dir (e.g. .cursor/rules/, .windsurf/rules/)",summary_skipped:"Skipped: {list}",summary_global:"Global docs (global/) are add-only \u2014 delete outdated files manually if needed",notify_enabled:"Claude Code desktop notifications enabled",schema:{parse_error:"JSON parse failed \u2014 file may be corrupted",version_too_new:"File version (v{current}) is newer than CLI expected version (v{expected}). Please upgrade the CLI.",roadmap_migrated:"{file}: migrated from v{from} to v{to}",roadmap_ok:"{file}: schema compatible",roadmap_error:"{file}: schema incompatible",no_plans:"No plan.json files found, skipping audit",plans_ok:"All {count} plan.json files are schema-compatible",plan_error:"{file}: schema incompatible (please review manually)"}},doctor:{title:"Architext Project Health Check",no_config:"Config file not found, remaining checks skipped",group:{config:"Configuration",doc_structure:"Doc Directory Structure",global_files:"Global Files",ide_rules:"IDE Framework Files",ide_notify:"IDE Notification Config"},summary:{result:"Result: {parts}",passed:"{n} passed",warned:"{n} warnings",failed:"{n} failed"},success:"Health check passed \u2014 everything looks good",with_warnings:"Check complete with warnings \u2014 review recommended",with_errors:"Check complete with errors \u2014 please fix before proceeding",check:{config:{not_found:"Config file not found",hint_init:"Run npx archi init to initialize the project",format_label:"Config file format",format_fail:"JSON parse failed \u2014 file may be corrupted",editors_label:"Editor config",editors_empty:"No editors configured",editors_invalid:"Contains invalid editors: {list}",editors_ok:"Editors: {list}",lang_label:"Language config",lang_invalid:"Unsupported language: {lang}",lang_ok:"Language: {lang}",doc_dir:"Doc dir: {dir}",doc_dir_unset:"(not set)",doc_dir_empty:"docDir field is empty"},dir:{missing:"Directory not found",hint_init:"Run npx archi init to reinitialize",hint_update:"Run npx archi update to restore",hint_features:"Create manually: mkdir {docDir}/tasks",hint_tasks:"Create manually: mkdir {docDir}/tasks"},global:{required_missing:"Required file missing",optional_missing:"File missing (non-blocking)",parse_fail:"JSON parse failed",roadmap_ok:"roadmap.json (Schema v{version} compatible)",roadmap_hint:"Run npx archi update to attempt auto-fix"},rules:{dir_missing:"Rules directory not found",dir_hint:"Run npx archi update to restore rule files",file_missing:"Rule file missing",file_hint:"Run npx archi update to restore"},notify:{status:"Desktop notification status",disabled:"Disabled",claude_label:"[Claude Code] Notification config",opencode_label:"[OpenCode] Notification config",not_configured:"Not configured",hint_run_update:"Run npx archi update to enable notifications"}}},pack:{title:"Architext Pack",no_config:"No .architext.json found \u2014 please run archi init first",packing:"Collecting user data...",empty:"No user data found, skipping pack",empty_hint:"Running pack before filling in any docs has no effect",done:"Packed {count} files \u2192 {file}",hint_recover:"After upgrade, restore with: /archi.recover {file}",success:"Pack complete",failed:"Pack failed"},help:{tagline:"No Docs, No Code. \u2014 AI-Native Architecture Protocol",section:{ai:"AI Commands (use in Chat)",cli:"CLI Commands (use in Terminal)",quick:"Quick Start",workflow:"Typical Workflow"},ai:{chatModeHint:"\u{1F4A1} Chat Mode: You can describe requirements in natural language. AI will detect intent and execute the appropriate protocol automatically.",start:{desc:"Cold start a new project. Interview vision, tech stack, generate doc skeleton.",detail:"Output: Vision + Tech Stack + Roadmap + Global doc skeleton",example:"e.g. /archi.start I want to build a Todo CLI tool in Rust"},inherit:{desc:"Take over a legacy project. Full code scan, reverse-engineer architecture, fill docs. Optionally provide Brief to supplement vision/roadmap.",detail:"For existing codebases lacking Architext docs; pass project-brief.md when codebase is minimal",example:"e.g. /archi.inherit project-brief.md"},scope:{desc:"Requirement decomposition. Read Scope Brief, break large requirements into Roadmap tasks with dependencies.",detail:"Output: Multiple Roadmap tasks (with ID/goal/deps). Falls back to interview mode without Brief",example:"e.g. /archi.scope scope-brief.md"},plan:{desc:"Deep task planning. Architecture interview for existing Roadmap tasks, generate full docs.",detail:"Output: Spec (logic) + UI (visual, if applicable) + Plan (steps)",example1:"e.g. /archi.plan INF-001 needs OAuth login support",example2:"e.g. /archi.plan FEAT-01"},code:{desc:"Translate docs to code. Read Plan, implement step by step with checks & audit.",detail:"Prerequisite: Task must have complete Spec + Plan",example:"e.g. /archi.code INF-001"},audit:{desc:"Independent deep code audit. Find bugs, gaps, and compliance issues.",detail:"With ID: audit specific task's code | No ID: project-level health check",example1:"e.g. /archi.audit INF-001",example2:"e.g. /archi.audit"},fix:{desc:"Fix a bug (not a requirement change). Diagnose and fix code, usually no Spec change.",detail:"Auto-records fix process to Plan for documentation consistency",example:"e.g. /archi.fix INF-001 login returns 403 error"},edit:{desc:"Local requirement change. Update Spec/UI docs first, then sync code changes.",detail:"Change chain: Update Spec/UI --> Append Plan steps --> Modify code",example:"e.g. /archi.edit INF-001 add remember-me feature"},revise:{desc:"Global change (tech stack, architecture). Analyzes impact, cascades updates to affected Tasks after confirmation.",detail:"Scope: Vision / Tech Stack / Roadmap / Related Task docs",example:"e.g. /archi.revise migrate from REST to GraphQL"},ui:{desc:"Generate or incrementally update UI concept designs (screens/ directory). UI projects only.",detail:"Full mode: generates all screens when screens/ doesn't exist. Incremental mode: updates based on roadmap diff when screens/ exists"},map:{desc:"Refresh architecture map. Rescan directory tree, update map.json.",detail:"Use when directory structure changes to keep map.json in sync"},remove:{desc:"Decommission a task. Full cleanup: impact analysis \u2192 delete docs+code \u2192 purge global refs.",detail:"Scope: Task docs / business code / roadmap / map / context_glue",example:"e.g. /archi.remove FEAT-003"},help:{desc:"Project navigator & contextual Q&A. Analyze state, suggest next actions.",detail:"No args: smart next-step recommendation; with question: project-aware answer",example1:"e.g. /archi.help",example2:"e.g. /archi.help what does the data model look like?"}},cli:{init:{desc:"Initialize Architext framework. Generate rules, doc directory, prompt templates. Optionally generates project-brief.md (fill in for /archi.start or /archi.inherit).",editor:"Target IDE (cursor / trae / windsurf / vscode / claude / opencode)",lang:"Language (zh / en)",doc:"Custom doc directory name (default: .architext)",type:"Project features, comma-separated (ui,data,api,cli,lib,mobile,desktop,miniapp,extension,realtime,ai)",noNotify:"Disable desktop notifications (default: enabled)"},update:{desc:"Sync latest rule templates to project, keep rules aligned with framework version.",dry_run:"Preview changes only, no actual writes"},doctor:{desc:"Read-only health scan: config validity, directory integrity, global file schemas, IDE rule files."},task:{desc:"Manage Roadmap tasks. View progress, update status, check dependency consistency.",detail:"No args: list all tasks | --check: verify dependency consistency",example:"e.g. npx archi task INF-001 --status done"},plan:{desc:"Check Task Plan completion (auto-detects manual verification sections).",example:"e.g. npx archi plan INF-001"},render:{desc:"Render JSON data files (roadmap/plan) into human-readable Markdown views."},template:{desc:"Fetch template files to project root for filling.",example:"e.g. npx archi template scope-brief"},uninstall:{desc:"Remove Architext framework and all generated files (rules, docs, config)."},pack:{desc:"Pack user data (docs, tasks, custom rules) into an XML backup file.",example:"e.g. npx archi pack -o backup.xml"}},quick:{new_project:"New project from scratch",legacy:"Take over legacy project",new_feature:"Plan a new task",write_code:"Implement code",fix_bug:"Fix a bug",check_health:"Check project health"},workflow:{init_flow:"Initial setup",new_feature:"New task:",change_spec:"Spec change:",standalone:"Standalone ops:"}}}};var Gt={common:{coming_soon:"\u{1F6A7} \u8BE5\u529F\u80FD\u6B63\u5728\u5F00\u53D1\u4E2D\uFF0C\u656C\u8BF7\u671F\u5F85\uFF01",error:{unexpected:"\u274C \u975E\u9884\u671F\u9519\u8BEF: {msg}",unknown:"\u274C \u53D1\u751F\u672A\u77E5\u9519\u8BEF",internal:"\u274C \u5185\u90E8\u9519\u8BEF [{code}]: {msg}",cancel:"\u{1F6AB} {msg}"}},init:{desc:"\u521D\u59CB\u5316 Architext \u6846\u67B6\uFF0C\u914D\u7F6E\u7F16\u8F91\u5668\u89C4\u5219\u548C\u6587\u6863\u9AA8\u67B6",editor:"\u6846\u67B6\u76EE\u6807IDE\uFF0C\u53EF\u591A\u9009\uFF0C\u9017\u53F7\u5206\u9694 (cursor/windsurf/trae/vscode/claude/opencode)",lang:"\u89C4\u5219\u4E0E\u6587\u6863\u9AA8\u67B6\u8BED\u8A00",doc:"\u81EA\u5B9A\u4E49\u6587\u6863\u8DEF\u5F84\uFF0C\u9ED8\u8BA4\u4F7F\u7528.architext",type:"\u9879\u76EE\u7279\u5F81\uFF0C\u9017\u53F7\u5206\u9694 (ui,data,api,cli,lib,mobile,desktop,miniapp,extension,realtime,ai)",yes:"\u8DF3\u8FC7\u6240\u6709\u786E\u8BA4\u63D0\u793A\uFF08\u8986\u76D6\u5DF2\u6709\u914D\u7F6E\u65F6\u81EA\u52A8\u786E\u8BA4\uFF09",brief:"\u751F\u6210 project-brief.md\uFF08\u4E0E -y \u914D\u5408\u4F7F\u7528\u53EF\u8DF3\u8FC7\u4EA4\u4E92\uFF09",notify:"\u542F\u7528\u684C\u9762\u901A\u77E5\uFF08\u9ED8\u8BA4\u5F00\u542F\uFF09",noNotify:"\u7981\u7528\u684C\u9762\u901A\u77E5",failed:"\u521D\u59CB\u5316\u5931\u8D25"},update:{desc:"\u540C\u6B65\u6700\u65B0\u89C4\u5219\uFF0C\u66F4\u65B0\u7F16\u8F91\u5668\u89C4\u5219\u548C\u6587\u6863\u9AA8\u67B6",failed:"\u5347\u7EA7\u5931\u8D25",version_gap_warning:"\u9879\u76EE\u7ED3\u6784\u7248\u672C (v{project}) \u4E0E CLI (v{current}) \u5DEE\u8DDD\u8F83\u5927\uFF0C\u81EA\u52A8\u66F4\u65B0\u53EF\u80FD\u4E0D\u5B8C\u6574\u3002\u5EFA\u8BAE\uFF1A1) \u8FD0\u884C npx archi pack \u5907\u4EFD\uFF1B2) \u5C06 pack \u8F93\u51FA\u4EA4\u7ED9 AI \u8F85\u52A9\u5408\u5E76\uFF1B3) \u6216\u91CD\u65B0 npx archi init\uFF08\u4F1A\u4E22\u5931\u5B9A\u5236\uFF09",dry_run_msg:"\u{1F50D} \u9884\u6F14\u6A21\u5F0F\u5DF2\u542F\u7528\u3002",construction:"\u66F4\u65B0\u529F\u80FD\u6B63\u5728\u5EFA\u8BBE\u4E2D..."},uninstall:{desc:"\u79FB\u9664 Architext \u6846\u67B6\u53CA\u5176\u751F\u6210\u7684\u6587\u4EF6"},doctor:{desc:"\u9879\u76EE\u5065\u5EB7\u68C0\u67E5\uFF1A\u914D\u7F6E\u3001\u76EE\u5F55\u7ED3\u6784\u3001\u5168\u5C40\u6587\u6863\u4E0E IDE \u89C4\u5219",failed:"\u73AF\u5883\u81EA\u68C0\u5931\u8D25",success:"\u7CFB\u7EDF\u68C0\u67E5\u901A\u8FC7\uFF1A\u4E00\u5207\u6B63\u5E38"},task:{desc:"\u7BA1\u7406\u9879\u76EE Roadmap \u4EFB\u52A1",status:"\u66F4\u65B0\u4EFB\u52A1\u72B6\u6001 (pending|active|done|blocked)",check:"\u68C0\u67E5 Roadmap \u4E00\u81F4\u6027"},plan:{desc:"\u68C0\u67E5\u529F\u80FD\u5B9E\u73B0\u8BA1\u5212 (plan.json) \u7684\u5B8C\u6210\u5EA6",id_required:"\u8BF7\u6307\u5B9A Task ID (\u4F8B\u5982: archi plan SUB-01)"},render:{desc:"\u5C06 JSON \u6570\u636E\u6587\u4EF6\u6E32\u67D3\u4E3A Markdown \u89C6\u56FE"},template:{desc:"\u83B7\u53D6\u6A21\u677F\u6587\u4EF6\u5230\u9879\u76EE\u6839\u76EE\u5F55"},help:{desc:"\u663E\u793A Architext \u547D\u4EE4\u5E2E\u52A9\u4FE1\u606F"},pack:{desc:"\u6253\u5305\u7528\u6237\u6570\u636E\uFF08\u6587\u6863\u3001\u4EFB\u52A1\u3001\u81EA\u5B9A\u4E49\u89C4\u5219\uFF09\uFF0C\u7528\u4E8E\u5347\u7EA7\u6216\u8FC1\u79FB\u524D\u5907\u4EFD",output:"\u8F93\u51FA\u6587\u4EF6\u8DEF\u5F84\uFF08\u9ED8\u8BA4: architext-pack.xml\uFF09"},notify:{desc:"\u53D1\u9001\u684C\u9762\u901A\u77E5\uFF08\u4F9B IDE hooks \u8C03\u7528\uFF09",title:"Architext",defaultMessage:"\u7B49\u5F85\u4E0B\u4E00\u6B65\u6307\u4EE4"},scaffold:{fallback:"\u672A\u627E\u5230 {lang} \u6A21\u677F\uFF0C\u56DE\u9000\u4F7F\u7528 'zh'",step_docs:"\u6B63\u5728\u521D\u59CB\u5316\u6587\u6863\u9AA8\u67B6...",step_rules:"\u6B63\u5728\u5B89\u88C5\u6838\u5FC3\u89C4\u5219...",step_ide:"\u6B63\u5728\u5206\u53D1 IDE \u89C4\u5219...",step_processing:"\u6B63\u5728\u5904\u7406 {group}...",complete:"\u811A\u624B\u67B6\u751F\u6210\u5B8C\u6210\u3002"},templates:{error:{root_not_found:"\u672A\u627E\u5230\u6A21\u677F\u76EE\u5F55\u3002\u5DF2\u641C\u7D22\u8DEF\u5F84: {paths}"}},command:{init:{title:"\u521D\u59CB\u5316 Architext \u6846\u67B6\uFF0C\u7528\u4E8E\u90E8\u7F72\u6807\u51C6\u5316\u7684 AI \u4E0A\u4E0B\u6587\u534F\u8BAE\u4E0E IDE \u89C4\u5219\u3002",select_editor:"\u8BF7\u9009\u62E9\u60A8\u7684\u76EE\u6807\u7F16\u8F91\u5668",select_lang:"\u8BF7\u9009\u62E9\u9879\u76EE\u6587\u6863\u8BED\u8A00",select_features:"\u8BF7\u9009\u62E9\u9879\u76EE\u7279\u5F81\uFF08\u53EF\u591A\u9009\uFF09",select_generate_brief:"\u662F\u5426\u751F\u6210 project-brief.md\uFF1F\uFF08\u751F\u6210\u540E\u586B\u5199\u9879\u76EE\u9700\u6C42\uFF0C\u4F9B /archi.start \u6216 /archi.inherit \u4F7F\u7528\uFF09",select_doc_dir:"\u8BF7\u8F93\u5165\u6587\u6863\u76EE\u5F55",config_exists:"\u68C0\u6D4B\u5230\u73B0\u6709\u914D\u7F6E\u6587\u4EF6 (architext.json)\u3002\u662F\u5426\u8986\u76D6\uFF1F",config_saved:"\u914D\u7F6E\u5DF2\u4FDD\u5B58\u5230 architext.json",conflict_title:"\u26A0\uFE0F \u68C0\u6D4B\u5230\u6587\u4EF6\u51B2\u7A81",conflict_msg:"\u4EE5\u4E0B\u6587\u4EF6\u5DF2\u5B58\u5728\uFF0C\u5C06\u5982\u4F55\u5904\u7406\uFF1F",conflict_more:" ... (\u8FD8\u6709 {count} \u4E2A\u6587\u4EF6)",conflict_overwrite:"\u8986\u76D6",conflict_skip:"\u8DF3\u8FC7",conflict_cancel:"\u53D6\u6D88",installing:"\u6B63\u5728\u590D\u5236\u6587\u4EF6...",cancel:"\u5DF2\u53D6\u6D88\u521D\u59CB\u5316",failed:"\u521D\u59CB\u5316\u5931\u8D25",success:"Architext \u521D\u59CB\u5316\u6210\u529F\uFF01 \u{1F680}"},uninstall:{desc:"\u79FB\u9664 Architext \u6846\u67B6\u53CA\u5176\u751F\u6210\u7684\u6587\u4EF6",title:"Architext \u5378\u8F7D\u5411\u5BFC",confirm_title:"\u26A0\uFE0F \u5371\u9669\u64CD\u4F5C\u8B66\u544A",confirm_msg:"\u6B64\u64CD\u4F5C\u5C06\u6C38\u4E45\u5220\u9664\u4EE5\u4E0B\u5185\u5BB9\uFF0C\u662F\u5426\u7EE7\u7EED\uFF1F",files_to_delete:"\u5C06\u5220\u9664\u7684\u6587\u4EF6/\u76EE\u5F55\uFF1A",done:"\u5378\u8F7D\u5B8C\u6210",success:"Architext \u5DF2\u6210\u529F\u79FB\u9664\u3002",error:"\u5378\u8F7D\u8FC7\u7A0B\u4E2D\u53D1\u751F\u9519\u8BEF\u3002",cancel:"\u5DF2\u53D6\u6D88\u5378\u8F7D\u3002",not_found:"\u672A\u627E\u5230\u914D\u7F6E\u6587\u4EF6 (architext.json)\uFF0C\u65E0\u6CD5\u81EA\u52A8\u5378\u8F7D\u3002",cleaning:"\u6B63\u5728\u6E05\u7406...",legacy_no_version:"\u5F53\u524D\u9879\u76EE\u4F7F\u7528\u65E7\u7248 Architext\uFF0C\u65E0\u6CD5\u81EA\u52A8\u5378\u8F7D\u3002",legacy_manual_hint:"\u8BF7\u624B\u52A8\u5220\u9664\u4EE5\u4E0B\u5185\u5BB9\uFF1A",legacy_exit:"\u8BF7\u624B\u52A8\u6E05\u7406\u540E\u91CD\u8BD5"},task:{check:{invalid_dep:"\u4EFB\u52A1 [{id}] \u7684\u4F9D\u8D56\u65E0\u6548: [{depId}] \u4E0D\u5B58\u5728\u4E8E\u4EFB\u52A1\u5217\u8868\u4E2D",consistent:"Roadmap \u4E00\u81F4\u6027\u68C0\u67E5\u901A\u8FC7\u3002"},update:{id_required:"\u66F4\u65B0\u72B6\u6001\u9700\u8981\u6307\u5B9A\u4EFB\u52A1 ID\u3002\u7528\u6CD5: architext task <id> --status <status>",updating:"\u6B63\u5728\u66F4\u65B0\u4EFB\u52A1 [{id}] \u72B6\u6001\u4E3A {status}...",done:"\u4EFB\u52A1 [{id}] -> {status}",unblocked:"\u4EFB\u52A1 [{id}] \u5DF2\u89E3\u9501 -> pending (\u6240\u6709\u4F9D\u8D56\u5DF2\u5B8C\u6210)"},list:{empty:"Roadmap \u4E2D\u672A\u627E\u5230\u4EFB\u52A1\u3002",title:"\u9879\u76EE Roadmap \u72B6\u6001"}},plan:{title:"Plan \u68C0\u67E5: {id} {name}",section_pass:"[{done}/{total}]",section_manual:"[{done}/{total}] (\u8DF3\u8FC7 \u2014 \u4EBA\u5DE5\u9A8C\u6536)",unchecked_item:" L{line}: {content}",total:"\u5408\u8BA1: {done}/{total} ({percent}%)",all_done:"\u6240\u6709\u81EA\u52A8\u5316\u4EFB\u52A1\u5DF2\u5B8C\u6210\uFF01",remaining:"\u5269\u4F59 {count} \u4E2A\u4EFB\u52A1\u672A\u5B8C\u6210",empty:"Plan \u6587\u4EF6\u4E2D\u6CA1\u6709 checkbox \u4EFB\u52A1",not_found:"\u672A\u627E\u5230 [{id}] \u7684\u5B9E\u73B0\u8BA1\u5212\u6587\u4EF6 (plan.json)"},template:{usage:"\u7528\u6CD5: npx archi template <name> \u53EF\u7528\u6A21\u677F:",unknown:'\u672A\u77E5\u6A21\u677F "{name}"\u3002\u53EF\u7528\u6A21\u677F: {available}',exists:"{path} \u5DF2\u5B58\u5728\uFF0C\u8DF3\u8FC7\u3002\u5982\u9700\u8986\u76D6\u8BF7\u5148\u5220\u9664\u3002",done:"\u5DF2\u751F\u6210 {path}\uFF0C\u586B\u5199\u540E\u8FD0\u884C /archi.scope \u5F00\u59CB\u5206\u89E3\u3002",not_found:"\u6A21\u677F\u6587\u4EF6 {name} \u672A\u627E\u5230\u3002\u8BF7\u5148\u8FD0\u884C npx archi init\u3002"},render:{empty:"\u672A\u627E\u5230\u53EF\u6E32\u67D3\u7684 JSON \u6570\u636E\u6587\u4EF6\u3002",done:"\u6E32\u67D3\u5B8C\u6210\uFF0C\u5171\u751F\u6210 {count} \u4E2A Markdown \u89C6\u56FE\u3002",plan:{header_comment:"<!-- \u26A0\uFE0F \u7531 plan.json \u81EA\u52A8\u751F\u6210 \u2014 \u8BF7\u52FF\u76F4\u63A5\u7F16\u8F91 -->",header_ai:"<!-- AI: \u8BF7\u8BFB\u53D6 plan.json \u800C\u975E\u6B64\u6587\u4EF6 -->",title:"\u5B9E\u65BD\u8BA1\u5212\uFF1A{featureName}",feature_id:"Task ID",status:"\u72B6\u6001",section_decisions:"\u6280\u672F\u51B3\u7B56",section_steps:"\u5B9E\u65BD\u6B65\u9AA4",section_tests:"\u6D4B\u8BD5\u8BA1\u5212",subsection_automated:"\u81EA\u52A8\u5316\u6D4B\u8BD5",subsection_manual:"\u4EBA\u5DE5\u9A8C\u6536"},roadmap:{header_comment:"<!-- \u26A0\uFE0F \u7531 roadmap.json \u81EA\u52A8\u751F\u6210 \u2014 \u8BF7\u52FF\u76F4\u63A5\u7F16\u8F91 -->",header_ai:"<!-- AI: \u8BF7\u8BFB\u53D6 roadmap.json \u800C\u975E\u6B64\u6587\u4EF6 -->",title:"\u9879\u76EE Roadmap",status:"\u72B6\u6001",updated:"\u66F4\u65B0\u4E8E",phase:"\u9636\u6BB5",goal:"\u76EE\u6807",dep:"\u4F9D\u8D56",dep_none:"\u65E0",tag:"\u6807\u7B7E",slug:"\u76EE\u5F55"}},update:{title:"Architext \u5347\u7EA7\u5411\u5BFC",no_config:"\u672A\u627E\u5230\u914D\u7F6E\u6587\u4EF6 (architext.json)\uFF0C\u8BF7\u5148\u8FD0\u884C npx archi init",cancel:"\u5DF2\u53D6\u6D88\u66F4\u65B0",success:"\u66F4\u65B0\u5B8C\u6210\uFF01",failed:"\u66F4\u65B0\u5931\u8D25",version_checking:"\u68C0\u67E5\u6700\u65B0\u7248\u672C...",version_check_skip:"\u7248\u672C\u68C0\u67E5\u5DF2\u8DF3\u8FC7\uFF08\u7F51\u7EDC\u4E0D\u53EF\u7528\uFF09",version_outdated:"\u53D1\u73B0\u65B0\u7248 v{latest}\uFF08\u5F53\u524D v{current}\uFF09",version_upgrade_hint:"\u5347\u7EA7\u547D\u4EE4: {cmd}",version_up_to_date:"\u5DF2\u662F\u6700\u65B0\u7248 v{version}",legacy_migration_blocked:"\u5F53\u524D\u9879\u76EE\u7F3A\u5C11\u7ED3\u6784\u7248\u672C\u4FE1\u606F\uFF0C\u4E0D\u652F\u6301\u81EA\u52A8\u66F4\u65B0\uFF0C\u8BF7\u6309\u4EE5\u4E0B\u6B65\u9AA4\u624B\u52A8\u8FC1\u79FB\uFF1A",legacy_migration_step1:" 1. npx archi pack \u5907\u4EFD\u6587\u6863\u6570\u636E",legacy_migration_step2:" 2. npx archi uninstall \u79FB\u9664\u65E7\u6846\u67B6\u6587\u4EF6\uFF08\u5982\u6709\u6B8B\u4F59\u8BF7\u624B\u52A8\u5220\u9664\uFF09",legacy_migration_step3:" 3. npx archi init \u91CD\u65B0\u521D\u59CB\u5316\u65B0\u7ED3\u6784",legacy_migration_step4:" 4. /archi.recover <pack\u6587\u4EF6> \u5728 AI \u4E2D\u8FD8\u539F\u6587\u6863\u6570\u636E",version_too_new:"\u9879\u76EE\u7ED3\u6784\u7248\u672C (v{project}) \u9AD8\u4E8E\u5F53\u524D CLI \u652F\u6301\u7684\u7248\u672C (v{cli})\uFF0C\u8BF7\u5148\u5347\u7EA7 CLI: npm install -g architext@latest",update_warning:"\u5C06\u5220\u9664\u65E7\u6846\u67B6\u6587\u4EF6\u5E76\u91CD\u65B0\u90E8\u7F72\u6700\u65B0\u7248\u672C\uFF1A",update_skip_hint:"\u4E0D\u89E6\u78B0: {list}",update_global_hint:"\u5168\u5C40\u6587\u6863\uFF08global/ \u4E0B\u7684 roadmap.json\u3001vision.md \u7B49\uFF09\u53EA\u589E\u4E0D\u51CF\uFF0C\u4E0D\u4F1A\u8986\u76D6\u5DF2\u6709\u5185\u5BB9",update_confirm:"\u786E\u8BA4\u6267\u884C\u66F4\u65B0\uFF1F",removing_old:"\u5220\u9664\u65E7\u6846\u67B6\u6587\u4EF6...",removed_old:"\u5DF2\u5220\u9664 {count} \u4E2A\u65E7\u6587\u4EF6",deploying_new:"\u90E8\u7F72\u65B0\u7248\u6846\u67B6\u6587\u4EF6...",deployed_new:"\u5DF2\u90E8\u7F72 {framework} \u4E2A\u6846\u67B6\u6587\u4EF6\uFF0C\u8865\u5145 {seeds} \u4E2A\u79CD\u5B50\u6587\u4EF6",migrating_structure:"\u6267\u884C v{fromVersion} \u2192 v{toVersion} \u7ED3\u6784\u8FC1\u79FB...",migrated_structure:"\u8FC1\u79FB\u5B8C\u6210\uFF0C\u5171\u5904\u7406 {count} \u9879\u53D8\u66F4",migration_warn:"\u8FC1\u79FB\u8FC7\u7A0B\u4E2D\u51FA\u73B0\u975E\u81F4\u547D\u9519\u8BEF\uFF0C\u5DF2\u8DF3\u8FC7",migration_nothing:"\u65E0\u9700\u8FC1\u79FB\uFF08\u5DF2\u662F\u6700\u65B0\u7ED3\u6784\uFF09",migration_partial:"\u90E8\u5206\u8FC1\u79FB\u5931\u8D25\uFF0C\u5DF2\u5B8C\u6210 {done} \u9879\u53D8\u66F4",migration_chain_broken:"\u8FC1\u79FB\u94FE\u65AD\u88C2: {error}",schema_auditing:"Schema \u517C\u5BB9\u6027\u5BA1\u8BA1...",summary:"\u66F4\u65B0\u6C47\u603B",summary_framework:"\u5DF2\u5237\u65B0 {count} \u4E2A\u6846\u67B6\u6587\u4EF6\uFF08rules/prompts/skills/templates\uFF09",summary_seeds:"\u5DF2\u8865\u5145 {count} \u4E2A\u79CD\u5B50\u6587\u4EF6",summary_templated:"02_tech_stack \u542B\u9879\u76EE\u5B9A\u5236\uFF0C\u672A\u8986\u76D6\u3002\u65B0\u7248\u6A21\u677F\u5DF2\u5199\u5165 {docDir}/templates/02_tech_stack.template.md\uFF0C\u8BF7\u5BF9\u6BD4\u5E76\u624B\u52A8\u5408\u5E76\u5230\u4F60\u4F7F\u7528\u7684 IDE rules \u76EE\u5F55\uFF08\u5982 .cursor/rules/\u3001.windsurf/rules/\uFF09\u4E0B\u5BF9\u5E94\u6587\u4EF6",summary_skipped:"\u5DF2\u8DF3\u8FC7: {list}",summary_global:"\u5168\u5C40\u6587\u6863\uFF08global/\uFF09\u53EA\u589E\u4E0D\u51CF\uFF0C\u5982\u9700\u6E05\u7406\u8FC7\u65F6\u6587\u4EF6\u8BF7\u624B\u52A8\u5220\u9664",notify_enabled:"\u5DF2\u542F\u7528 Claude Code \u684C\u9762\u901A\u77E5",schema:{parse_error:"JSON \u89E3\u6790\u5931\u8D25\uFF0C\u6587\u4EF6\u53EF\u80FD\u5DF2\u635F\u574F",version_too_new:"\u6587\u4EF6\u7248\u672C (v{current}) \u9AD8\u4E8E CLI \u671F\u671B\u7248\u672C (v{expected})\uFF0C\u8BF7\u5148\u5347\u7EA7 CLI",roadmap_migrated:"{file}: \u5DF2\u4ECE v{from} \u8FC1\u79FB\u81F3 v{to}",roadmap_ok:"{file}: \u7ED3\u6784\u517C\u5BB9",roadmap_error:"{file}: \u7ED3\u6784\u4E0D\u517C\u5BB9",no_plans:"\u672A\u627E\u5230 plan.json \u6587\u4EF6\uFF0C\u8DF3\u8FC7\u5BA1\u8BA1",plans_ok:"\u6240\u6709 {count} \u4E2A plan.json \u7ED3\u6784\u517C\u5BB9",plan_error:"{file}: \u7ED3\u6784\u4E0D\u517C\u5BB9\uFF08\u8BF7\u624B\u52A8\u68C0\u67E5\uFF09"}},doctor:{title:"Architext \u9879\u76EE\u5065\u5EB7\u68C0\u67E5",no_config:"\u672A\u627E\u5230\u914D\u7F6E\u6587\u4EF6\uFF0C\u540E\u7EED\u68C0\u67E5\u5DF2\u8DF3\u8FC7",group:{config:"\u9879\u76EE\u914D\u7F6E",doc_structure:"\u6587\u6863\u76EE\u5F55\u7ED3\u6784",global_files:"\u5168\u5C40\u6587\u6863",ide_rules:"IDE \u6846\u67B6\u6587\u4EF6",ide_notify:"IDE \u901A\u77E5\u914D\u7F6E"},summary:{result:"\u7ED3\u679C: {parts}",passed:"{n} \u901A\u8FC7",warned:"{n} \u8B66\u544A",failed:"{n} \u5931\u8D25"},success:"\u9879\u76EE\u5065\u5EB7\u68C0\u67E5\u901A\u8FC7\uFF0C\u4E00\u5207\u6B63\u5E38",with_warnings:"\u68C0\u67E5\u5B8C\u6210\uFF0C\u5B58\u5728\u8B66\u544A\uFF0C\u5EFA\u8BAE\u5173\u6CE8",with_errors:"\u68C0\u67E5\u5B8C\u6210\uFF0C\u5B58\u5728\u95EE\u9898\uFF0C\u8BF7\u4FEE\u590D\u540E\u91CD\u8BD5",check:{config:{not_found:"\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728",hint_init:"\u8FD0\u884C npx archi init \u521D\u59CB\u5316\u9879\u76EE",format_label:"\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F",format_fail:"JSON \u89E3\u6790\u5931\u8D25\uFF0C\u6587\u4EF6\u53EF\u80FD\u5DF2\u635F\u574F",editors_label:"\u7F16\u8F91\u5668\u914D\u7F6E",editors_empty:"\u672A\u914D\u7F6E\u4EFB\u4F55\u7F16\u8F91\u5668",editors_invalid:"\u542B\u65E0\u6548\u7F16\u8F91\u5668: {list}",editors_ok:"\u7F16\u8F91\u5668: {list}",lang_label:"\u8BED\u8A00\u914D\u7F6E",lang_invalid:"\u4E0D\u652F\u6301\u7684\u8BED\u8A00: {lang}",lang_ok:"\u8BED\u8A00: {lang}",doc_dir:"\u6587\u6863\u76EE\u5F55: {dir}",doc_dir_unset:"(\u672A\u8BBE\u7F6E)",doc_dir_empty:"docDir \u5B57\u6BB5\u4E3A\u7A7A"},dir:{missing:"\u76EE\u5F55\u4E0D\u5B58\u5728",hint_init:"\u8FD0\u884C npx archi init \u91CD\u65B0\u521D\u59CB\u5316",hint_update:"\u8FD0\u884C npx archi update \u6062\u590D",hint_features:"\u624B\u52A8\u521B\u5EFA\u5373\u53EF\uFF1Amkdir {docDir}/tasks",hint_tasks:"\u624B\u52A8\u521B\u5EFA\u5373\u53EF\uFF1Amkdir {docDir}/tasks"},global:{required_missing:"\u5FC5\u8981\u6587\u6863\u7F3A\u5931",optional_missing:"\u6587\u6863\u7F3A\u5931\uFF08\u4E0D\u5F71\u54CD\u8FD0\u884C\uFF09",parse_fail:"JSON \u89E3\u6790\u5931\u8D25",roadmap_ok:"roadmap.json (Schema v{version} \u517C\u5BB9)",roadmap_hint:"\u8FD0\u884C npx archi update \u5C1D\u8BD5\u81EA\u52A8\u4FEE\u590D"},rules:{dir_missing:"\u89C4\u5219\u76EE\u5F55\u4E0D\u5B58\u5728",dir_hint:"\u8FD0\u884C npx archi update \u6062\u590D\u89C4\u5219\u6587\u4EF6",file_missing:"\u89C4\u5219\u6587\u4EF6\u7F3A\u5931",file_hint:"\u8FD0\u884C npx archi update \u6062\u590D"},notify:{status:"\u684C\u9762\u901A\u77E5\u72B6\u6001",disabled:"\u5DF2\u7981\u7528",claude_label:"[Claude Code] \u901A\u77E5\u914D\u7F6E",opencode_label:"[OpenCode] \u901A\u77E5\u914D\u7F6E",not_configured:"\u672A\u914D\u7F6E",hint_run_update:"\u8FD0\u884C npx archi update \u542F\u7528\u901A\u77E5"}}},pack:{title:"Architext Pack",no_config:"\u672A\u627E\u5230 .architext.json\uFF0C\u8BF7\u5148\u8FD0\u884C archi init",packing:"\u6B63\u5728\u6536\u96C6\u7528\u6237\u6570\u636E...",empty:"\u672A\u627E\u5230\u4EFB\u4F55\u7528\u6237\u6570\u636E\uFF0C\u8DF3\u8FC7\u6253\u5305",empty_hint:"\u5728 archi init \u4E4B\u540E\u3001\u586B\u5199\u6587\u6863\u4E4B\u524D\u8FD0\u884C pack \u65E0\u610F\u4E49",done:"\u5DF2\u6253\u5305 {count} \u4E2A\u6587\u4EF6 \u2192 {file}",hint_recover:"\u5347\u7EA7\u540E\u8FD8\u539F: /archi.recover {file}",success:"\u6253\u5305\u5B8C\u6210",failed:"\u6253\u5305\u5931\u8D25"},help:{tagline:"No Docs, No Code. \u2014 AI \u539F\u751F\u67B6\u6784\u534F\u8BAE",section:{ai:"AI Commands (\u5728 Chat \u4E2D\u4F7F\u7528)",cli:"CLI Commands (\u5728\u7EC8\u7AEF\u4E2D\u4F7F\u7528)",quick:"Quick Start (\u5FEB\u901F\u51B3\u7B56)",workflow:"Typical Workflow (\u5178\u578B\u5DE5\u4F5C\u6D41)"},ai:{chatModeHint:"\u{1F4A1} Chat Mode: \u53EF\u76F4\u63A5\u7528\u81EA\u7136\u8BED\u8A00\u63CF\u8FF0\u9700\u6C42\uFF0CAI \u4F1A\u81EA\u52A8\u8BC6\u522B\u610F\u56FE\u5E76\u6267\u884C\u5BF9\u5E94\u534F\u8BAE\u3002",start:{desc:"\u65B0\u9879\u76EE\u51B7\u542F\u52A8\u3002\u901A\u8FC7\u8BBF\u8C08\u786E\u7ACB\u613F\u666F\u3001\u6280\u672F\u6808\uFF0C\u751F\u6210\u6587\u6863\u9AA8\u67B6\u3002",detail:"\u4EA7\u51FA: Vision + Tech Stack + Roadmap + \u5168\u5C40\u6587\u6863\u9AA8\u67B6",example:"\u4F8B: /archi.start \u6211\u8981\u505A\u4E00\u4E2A Todo CLI \u5DE5\u5177\uFF0C\u7528 Rust \u5199"},inherit:{desc:"\u63A5\u7BA1\u65E7\u9879\u76EE\u3002\u5168\u91CF\u626B\u63CF\u4EE3\u7801\uFF0C\u9006\u5411\u63A8\u5BFC\u67B6\u6784\uFF0C\u586B\u5145\u5168\u5C40\u6587\u6863\u3002\u53EF\u9009\u63D0\u4F9B Brief \u8865\u5145\u613F\u666F/\u8DEF\u7EBF\u56FE\u3002",detail:"\u9002\u7528\u4E8E\u5DF2\u6709\u4EE3\u7801\u5E93\u4F46\u7F3A\u5C11 Architext \u6587\u6863\u7684\u9879\u76EE\uFF1B\u4EE3\u7801\u5E93\u5C1A\u7A7A\u65F6\u53EF\u4F20 project-brief.md",example:"\u4F8B: /archi.inherit project-brief.md"},scope:{desc:"\u9700\u6C42\u5206\u89E3\u3002\u8BFB\u53D6 Scope Brief\uFF0C\u5C06\u5927\u9700\u6C42\u62C6\u89E3\u4E3A\u591A\u4E2A Roadmap \u4EFB\u52A1\u5E76\u5EFA\u7ACB\u4F9D\u8D56\u5173\u7CFB\u3002",detail:"\u4EA7\u51FA: \u591A\u4E2A Roadmap \u4EFB\u52A1 (\u542B ID/\u76EE\u6807/\u4F9D\u8D56)\u3002\u65E0 Brief \u65F6\u81EA\u52A8\u8FDB\u5165\u8BBF\u8C08\u6A21\u5F0F",example:"\u4F8B: /archi.scope scope-brief.md"},plan:{desc:"\u529F\u80FD\u6DF1\u5EA6\u89C4\u5212\u3002\u5BF9 Roadmap \u4E2D\u5DF2\u6709\u4EFB\u52A1\u505A\u67B6\u6784\u8BBF\u8C08\uFF0C\u751F\u6210\u5B8C\u6574\u6587\u6863\u3002",detail:"\u4EA7\u51FA: Spec (\u529F\u80FD\u903B\u8F91) + UI (\u89C6\u89C9\u8BBE\u8BA1, \u5982\u9002\u7528) + Plan (\u5B9E\u65BD\u6B65\u9AA4)",example1:"\u4F8B: /archi.plan INF-001 \u9700\u8981\u652F\u6301 OAuth \u767B\u5F55",example2:"\u4F8B: /archi.plan FEAT-01"},code:{desc:"\u5C06\u6587\u6863\u7FFB\u8BD1\u4E3A\u4EE3\u7801\u3002\u8BFB\u53D6 Plan\uFF0C\u9010\u6B65\u5B9E\u73B0\uFF0C\u542B\u9759\u6001\u68C0\u67E5\u4E0E\u5BA1\u8BA1\u3002",detail:"\u524D\u7F6E: \u5BF9\u5E94 Task \u987B\u6709\u5B8C\u6574\u7684 Spec + Plan",example:"\u4F8B: /archi.code INF-001"},audit:{desc:"\u72EC\u7ACB\u6DF1\u5EA6\u4EE3\u7801\u5BA1\u67E5\u3002\u627E Bug\u3001\u627E\u7F3A\u6F0F\u3001\u67E5\u5408\u89C4\u3002",detail:"\u5E26 ID: \u5BA1\u67E5\u6307\u5B9A\u4EFB\u52A1\u7684\u4EE3\u7801\u5B9E\u73B0 | \u65E0 ID: \u9879\u76EE\u7EA7\u5065\u5EB7\u4F53\u68C0",example1:"\u4F8B: /archi.audit INF-001",example2:"\u4F8B: /archi.audit"},fix:{desc:"\u4FEE\u590D Bug\uFF08\u975E\u9700\u6C42\u53D8\u66F4\uFF09\u3002\u8BCA\u65AD\u9519\u8BEF\u5E76\u4FEE\u590D\u4EE3\u7801\uFF0C\u901A\u5E38\u4E0D\u6539 Spec\u3002",detail:"\u81EA\u52A8\u8BB0\u5F55\u4FEE\u590D\u8FC7\u7A0B\u5230 Plan\uFF0C\u4FDD\u6301\u6587\u6863\u4E00\u81F4\u6027",example:"\u4F8B: /archi.fix INF-001 \u767B\u5F55\u65F6\u62A5 403 \u9519\u8BEF"},edit:{desc:"\u5C40\u90E8\u9700\u6C42\u53D8\u66F4\u3002\u5148\u6539 Spec/UI \u6587\u6863\uFF0C\u518D\u540C\u6B65\u4FEE\u6539\u4EE3\u7801\u3002",detail:"\u53D8\u66F4\u94FE\u8DEF: \u66F4\u65B0 Spec/UI --> \u8FFD\u52A0 Plan \u6B65\u9AA4 --> \u4FEE\u6539\u4EE3\u7801",example:"\u4F8B: /archi.edit INF-001 \u589E\u52A0\u8BB0\u4F4F\u5BC6\u7801\u529F\u80FD"},revise:{desc:"\u5168\u5C40\u53D8\u66F4\uFF08\u6280\u672F\u6808\u3001\u67B6\u6784\u7B49\uFF09\u3002\u5206\u6790\u5F71\u54CD\u8303\u56F4\uFF0C\u7ECF\u786E\u8BA4\u540E\u7EA7\u8054\u66F4\u65B0\u76F8\u5173 Task\u3002",detail:"\u5F71\u54CD\u8303\u56F4: Vision / Tech Stack / Roadmap / \u76F8\u5173 Task \u6587\u6863",example:"\u4F8B: /archi.revise \u4ECE REST \u8FC1\u79FB\u5230 GraphQL"},ui:{desc:"\u751F\u6210\u6216\u589E\u91CF\u66F4\u65B0 UI \u6982\u5FF5\u8BBE\u8BA1\uFF08screens/ \u76EE\u5F55\uFF09\u3002\u4EC5 UI \u7C7B\u9879\u76EE\u3002",detail:"\u5168\u91CF\u6A21\u5F0F: screens/ \u4E0D\u5B58\u5728\u65F6\u5168\u91CF\u751F\u6210\u3002\u589E\u91CF\u6A21\u5F0F: screens/ \u5B58\u5728\u65F6\u6839\u636E roadmap \u5DEE\u5F02\u66F4\u65B0"},map:{desc:"\u5237\u65B0\u67B6\u6784\u5730\u56FE\u3002\u91CD\u65B0\u626B\u63CF\u76EE\u5F55\u6811\uFF0C\u66F4\u65B0 map.json\u3002",detail:"\u5F53\u76EE\u5F55\u7ED3\u6784\u53D1\u751F\u53D8\u5316\u65F6\u4F7F\u7528\uFF0C\u4FDD\u6301 map.json \u4E0E\u5B9E\u9645\u6587\u4EF6\u7CFB\u7EDF\u540C\u6B65"},remove:{desc:"\u7279\u6027\u4E0B\u7EBF\u3002\u5168\u94FE\u8DEF\u6E05\u9664\uFF1A\u5F71\u54CD\u5206\u6790 \u2192 \u5220\u9664\u6587\u6863+\u4EE3\u7801 \u2192 \u6E05\u7406\u5168\u5C40\u5F15\u7528\u3002",detail:"\u6E05\u7406\u8303\u56F4: Task \u6587\u6863 / \u4E1A\u52A1\u4EE3\u7801 / roadmap / map / context_glue",example:"\u4F8B: /archi.remove FEAT-003"},help:{desc:"\u9879\u76EE\u5BFC\u822A\u4E0E\u4E0A\u4E0B\u6587\u95EE\u7B54\u3002\u5206\u6790\u9879\u76EE\u72B6\u6001\uFF0C\u5EFA\u8BAE\u4E0B\u4E00\u6B65\u64CD\u4F5C\u3002",detail:"\u65E0\u53C2\u6570\u65F6\u667A\u80FD\u63A8\u8350\u4E0B\u4E00\u6B65\uFF1B\u5E26\u95EE\u9898\u65F6\u57FA\u4E8E\u9879\u76EE\u4E0A\u4E0B\u6587\u56DE\u7B54",example1:"\u4F8B: /archi.help",example2:"\u4F8B: /archi.help \u8FD9\u4E2A\u9879\u76EE\u7684\u6570\u636E\u6A21\u578B\u957F\u4EC0\u4E48\u6837\uFF1F"}},cli:{init:{desc:"\u521D\u59CB\u5316 Architext \u6846\u67B6\u3002\u751F\u6210\u89C4\u5219\u6587\u4EF6\u3001\u6587\u6863\u76EE\u5F55\u3001Prompt \u6A21\u677F\u3002\u53EF\u9009\u751F\u6210 project-brief.md\uFF08\u751F\u6210\u540E\u586B\u5199\u9879\u76EE\u9700\u6C42\uFF0C\u4F9B /archi.start \u6216 /archi.inherit \u4F7F\u7528\uFF09\u3002",editor:"\u6307\u5B9A IDE (cursor / trae / windsurf / vscode / claude / opencode)",lang:"\u6307\u5B9A\u8BED\u8A00 (zh / en)",doc:"\u81EA\u5B9A\u4E49\u6587\u6863\u76EE\u5F55\u540D (\u9ED8\u8BA4 .architext)",type:"\u9879\u76EE\u7279\u5F81\uFF0C\u9017\u53F7\u5206\u9694 (ui,data,api,cli,lib,mobile,desktop,miniapp,extension,realtime,ai)",noNotify:"\u7981\u7528\u684C\u9762\u901A\u77E5\uFF08\u9ED8\u8BA4\u542F\u7528\uFF09"},update:{desc:"\u540C\u6B65\u6700\u65B0\u89C4\u5219\u6A21\u677F\u5230\u9879\u76EE\uFF0C\u4FDD\u6301\u89C4\u5219\u6587\u4EF6\u4E0E\u6846\u67B6\u7248\u672C\u4E00\u81F4\u3002",dry_run:"\u4EC5\u9884\u89C8\u53D8\u66F4\uFF0C\u4E0D\u5B9E\u9645\u5199\u5165"},doctor:{desc:"\u53EA\u8BFB\u5065\u5EB7\u626B\u63CF\uFF1A\u914D\u7F6E\u6709\u6548\u6027\u3001\u76EE\u5F55\u5B8C\u6574\u6027\u3001\u5168\u5C40\u6587\u6863 Schema\u3001IDE \u89C4\u5219\u6587\u4EF6\u3002"},task:{desc:"\u7BA1\u7406 Roadmap \u4EFB\u52A1\u3002\u67E5\u770B\u8FDB\u5EA6\u3001\u66F4\u65B0\u72B6\u6001\u3001\u68C0\u67E5\u4F9D\u8D56\u4E00\u81F4\u6027\u3002",detail:"\u65E0\u53C2\u6570: \u5217\u51FA\u6240\u6709\u4EFB\u52A1 | --check: \u68C0\u67E5\u4F9D\u8D56\u4E00\u81F4\u6027",example:"\u4F8B: npx archi task INF-001 --status done"},plan:{desc:"\u68C0\u67E5\u6307\u5B9A Task \u7684 Plan \u5B8C\u6210\u5EA6\uFF08\u81EA\u52A8\u8BC6\u522B\u4EBA\u5DE5\u9A8C\u6536\u533A\u57DF\uFF09\u3002",example:"\u4F8B: npx archi plan INF-001"},render:{desc:"\u5C06 JSON \u6570\u636E\u6587\u4EF6 (roadmap/plan) \u6E32\u67D3\u4E3A\u4EBA\u7C7B\u53EF\u8BFB\u7684 Markdown \u89C6\u56FE\u3002"},template:{desc:"\u83B7\u53D6\u6A21\u677F\u6587\u4EF6\u5230\u9879\u76EE\u6839\u76EE\u5F55\u4F9B\u586B\u5199\u3002",example:"\u4F8B: npx archi template scope-brief"},uninstall:{desc:"\u79FB\u9664 Architext \u6846\u67B6\u53CA\u5176\u751F\u6210\u7684\u6240\u6709\u6587\u4EF6\uFF08\u89C4\u5219\u3001\u6587\u6863\u3001\u914D\u7F6E\uFF09\u3002"},pack:{desc:"\u6253\u5305\u7528\u6237\u6570\u636E\uFF08\u6587\u6863\u3001\u4EFB\u52A1\u3001\u81EA\u5B9A\u4E49\u89C4\u5219\uFF09\u4E3A XML \u5907\u4EFD\u6587\u4EF6\u3002",example:"\u4F8B: npx archi pack -o backup.xml"}},quick:{new_project:"\u65B0\u9879\u76EE\u4ECE\u96F6\u5F00\u59CB",legacy:"\u63A5\u7BA1\u65E7\u9879\u76EE",new_feature:"\u89C4\u5212\u65B0\u4EFB\u52A1",write_code:"\u5B9E\u73B0\u4EE3\u7801",fix_bug:"\u4FEE\u590D Bug",check_health:"\u68C0\u67E5\u9879\u76EE\u5065\u5EB7"},workflow:{init_flow:"\u9996\u6B21\u542F\u52A8:",new_feature:"\u65B0\u589E\u4EFB\u52A1:",change_spec:"\u9700\u6C42\u53D8\u66F4:",standalone:"\u72EC\u7ACB\u64CD\u4F5C:"}}}};var wt={zh:Gt,en:Ut};function je(e,t){if(e)return t.split(".").reduce((o,i)=>{if(o!=null&&typeof o=="object")return o[i]},e)}function _(){let e=process.env.ARCHITEXT_LANG;return e&&(e==="zh"||e==="en")?e:new Intl.DateTimeFormat().resolvedOptions().locale.startsWith("zh")?"zh":"en"}function k(e="zh",t){let o=wt[e]||wt.zh,i=wt.en,r=t?je(o,t):o,n=t?je(i,t):i;return(c,s)=>{let a;return t?a=je(r,c)||je(n,c):a=je(o,c)||je(i,c),a?s?String(a).replace(/\{(\w+)\}/g,(p,d)=>s[d]!==void 0?String(s[d]):p):String(a):c}}import q from"fs-extra";import Y from"path";import{readFileSync as mi}from"fs";import fi from"path";var G={DEFAULT_DOC_DIR:".architext",PATHS:{DOCS_SOURCE:"docs",RULES_SOURCE:"rules",RULES_TARGET:"rules",PROMPTS_SOURCE:"docs/prompts",BRIEFS_SOURCE:"briefs",SKILLS_SOURCE:"skills",SKILLS_DOC_TARGET:"skills"},PLACEHOLDERS:{DOCS_DIR:"[[__DOCS_DIR__]]",PROJECT_TYPE:"[[__PROJECT_TYPE__]]",PROMPTS_PATH:"[[__PROMPTS_PATH__]]"}},xt={zh:{label:"\u4E2D\u6587"},en:{label:"English"}},D={cursor:{label:"Cursor",targetDir:".cursor/rules",targetExt:".mdc",commands:{targetDir:".cursor/commands"},skills:{targetDir:".cursor/skills"},subagents:!0},windsurf:{label:"Windsurf",targetDir:".windsurf/rules",targetExt:".md",skills:{targetDir:".windsurf/skills"}},trae:{label:"Trae",targetDir:".trae/rules",targetExt:".md",skills:{targetDir:".trae/skills"},subagents:!0},vscode:{label:"VS Code",targetDir:".github/instructions",targetExt:".instructions.md",skills:{targetDir:".github/skills"},subagents:!0},claude:{label:"Claude Code",targetDir:".claude/rules",targetExt:".md",commands:{targetDir:".claude/commands"},skills:{targetDir:".claude/skills"},subagents:!0},opencode:{label:"OpenCode",targetDir:".opencode/rules",targetExt:".md",commands:{targetDir:".opencode/commands"},skills:{targetDir:".opencode/skills"},subagents:!0}},xe=Object.keys(D);function Vt(e,t){let o=D[e];return o?.commands?o.commands.targetDir:`${t}/prompts/${e}`}var bt=[{value:"ui",label:"ui",hint:"\u6709\u7528\u6237\u754C\u9762\uFF08Web/\u79FB\u52A8\u7AEF/\u684C\u9762\u7AEF/\u5C0F\u7A0B\u5E8F\uFF09"},{value:"data",label:"data",hint:"\u6709\u6570\u636E\u5C42\uFF08\u6570\u636E\u5E93/ORM/\u672C\u5730\u5B58\u50A8\uFF09"},{value:"api",label:"api",hint:"\u6709 HTTP/RPC/GraphQL \u63A5\u53E3"},{value:"cli",label:"cli",hint:"\u6709\u547D\u4EE4\u884C\u5165\u53E3"},{value:"lib",label:"lib",hint:"\u4F5C\u4E3A\u5E93/SDK/NPM \u5305\u53D1\u5E03"},{value:"mobile",label:"mobile",hint:"\u79FB\u52A8\u7AEF\uFF08RN/Flutter/Expo\uFF09"},{value:"desktop",label:"desktop",hint:"\u684C\u9762\u7AEF\uFF08Electron/Tauri\uFF09"},{value:"miniapp",label:"miniapp",hint:"\u5C0F\u7A0B\u5E8F\uFF08\u5FAE\u4FE1/\u652F\u4ED8\u5B9D/uni-app\uFF09"},{value:"extension",label:"extension",hint:"\u6D4F\u89C8\u5668\u6269\u5C55\uFF08Chrome/Firefox\uFF09"},{value:"realtime",label:"realtime",hint:"\u5B9E\u65F6/WebSocket/\u534F\u4F5C"},{value:"ai",label:"ai",hint:"AI Agent / MCP"}],tt={"scope-brief":{file:"scope-brief.template.md",output:"scope-brief.md"}},Jt="_base.md",Bt="_modules.md",zt="project-brief.md",ot="brief-assets";function Je(e,t,o){return o&&(e=e.replace(/\[\[INCLUDE: ([^\]]+)\]\]/g,(i,r)=>{let n=fi.join(o,r.trim());try{return mi(n,"utf-8").trim()}catch{return`<!-- INCLUDE NOT FOUND: ${r.trim()} -->`}})),e=e.replace(/\[\[SUBAGENT: ([^|]+)\|(.+?)\]\]/g,(i,r,n)=>{let c=r.trim(),s=n.trim();return t.hasSubagents?`**[\u5B50\u4EE3\u7406]** \u542F\u52A8\u72EC\u7ACB\u5B50\u4EE3\u7406\u6267\u884C\u4EE5\u4E0B\u5BA1\u67E5\uFF08\u7981\u5728\u5F53\u524D\u4E0A\u4E0B\u6587\u5185\u8054\u6267\u884C\uFF09\u3002\u5B50\u4EE3\u7406\u8BFB\u53D6 \`skills/${c}/SKILL.md\` \u4F5C\u4E3A\u6267\u884C\u6307\u4EE4\uFF0C\u5728\u5168\u65B0\u4E0A\u4E0B\u6587\u4E2D\u8FD0\u884C\uFF0C\u5B8C\u6210\u540E\u5C06\u7ED3\u679C\u8FD4\u56DE\u5F53\u524D\u6D41\u7A0B\u3002\u53C2\u6570\uFF1A${s}`:t.hasSkills?`\u8BF7\u8BFB\u53D6 Skill \`skills/${c}/SKILL.md\` \u5E76\u5728\u5F53\u524D\u4E0A\u4E0B\u6587\u4E2D\u6309\u5176\u6307\u4EE4\u6267\u884C\u3002\u53C2\u6570\uFF1A${s}`:""}),e=e.replace(/\[\[SKILL: ([^|]+)\|(.+?)\]\]/g,(i,r,n)=>t.hasSkills?`\u8BF7\u4F7F\u7528 Skill \u5DE5\u5177\u8C03\u7528 \`${r.trim()}\`\uFF0C\u53C2\u6570\uFF1A${n.trim()}`:""),e=e.replace(/\[\[NO-SKILL: ([^\]]+)\]\]/g,(i,r)=>t.hasSkills?"":r),e=e.replace(/\[\[NO-COMMANDS:\s*([\s\S]*?)\s*\]\]/g,(i,r)=>t.hasCommands?"":r.trim()),e}var gi=[{version:1,rules:["00_system","01_workflow","02_tech_stack","03_data_governance","04_cli_tools","90_custom_rules","99_context_glue"],prompts:["start","inherit","scope","plan","code","edit","revise","audit","fix","map","remove","help","recover","ref"],skills:["archi-data-sync","archi-decompose-roadmap","archi-design-patterns","archi-feature-relations","archi-interview-protocol","archi-plan-options","archi-silent-audit","archi-ui-wireframe"],docTemplates:["design.template.md","plan.template.json","scope-brief.template.md","spec.template.md","ui.template.md"],globalSeeds:["dictionary.json","error_codes.json","map.json","roadmap.json","vision.md",{file:"api_snapshot.json",feature:"api"},{file:"command_api.json",feature:"cli"},{file:"data_snapshot.json",feature:"data"},{file:"design_tokens.json",feature:"ui"},{file:"env_registry.json",feature:"api"},{file:"public_api.json",feature:"lib"}],globalDocs:[],rulePolicy:{"02_tech_stack":"templateOnly","90_custom_rules":"neverTouch"}},{version:2,rules:["00_system","90_custom_rules"],prompts:["start","inherit","scope","plan","code","edit","revise","audit","fix","map","remove","help","recover","ref","ui","script"],skills:["archi-data-sync","archi-decompose-roadmap","archi-design-patterns","archi-feature-relations","archi-interview-protocol","archi-plan-options","archi-silent-audit","archi-ui-wireframe"],docTemplates:["design.template.md","plan.template.json","scope-brief.template.md","spec.template.md","ui.template.md"],globalSeeds:["dictionary.json","error_codes.json","error_memory.json","map.json","roadmap.json","env_registry.json","vision.md","tech_stack.md",{file:"api_snapshot.json",feature:"api"},{file:"command_api.json",feature:"cli"},{file:"data_snapshot.json",feature:"data"},{file:"design_tokens.json",feature:"ui"},{file:"public_api.json",feature:"lib"}],globalDocs:["cli_reference.md"],rulePolicy:{"90_custom_rules":"neverTouch"}}],re=2;function St(e){return gi.find(t=>t.version===e)}function z(){let e=St(re);if(!e)throw new Error(`FileModel version ${re} not found in registry`);return e}function oe(e){return e.replace(/\\/g,"/")}function Oe(e,t){let o=[],i=[],r=[],n=new Set(t.features??[]);for(let a of t.editors){let p=D[a];if(p){for(let d of e.rules)o.push(oe(`${p.targetDir}/${d}${p.targetExt}`));for(let d of e.prompts)p.commands?o.push(oe(`${p.commands.targetDir}/archi.${d}.md`)):o.push(oe(`${t.docDir}/prompts/${a}/archi.${d}.md`));if(p.skills)for(let d of e.skills)i.push(oe(`${p.skills.targetDir}/${d}`))}}if(t.editors.some(a=>!D[a]?.skills))for(let a of e.skills)i.push(oe(`${t.docDir}/skills/${a}`));for(let a of e.docTemplates)o.push(oe(`${t.docDir}/templates/${a}`));for(let a of e.globalDocs)o.push(oe(`${t.docDir}/global/references/${a}`));for(let a of e.globalSeeds)typeof a=="string"?r.push(oe(`${t.docDir}/global/${a}`)):n.has(a.feature)&&r.push(oe(`${t.docDir}/global/${a.file}`));let s=[oe(`${t.docDir}/tasks`),oe(`${t.docDir}/refs`),oe(`${t.docDir}/scripts`)];return{frameworkFiles:o,frameworkDirs:i,seedFiles:r,scaffoldDirs:s}}function it(e,t){return Oe(e,{editors:xe,docDir:t,features:[]})}import{ZodError as Si}from"zod";var v=class extends Error{code;isUserError;constructor(t,o="INTERNAL_ERROR",i=!1){super(t),this.name="AppError",this.code=o,this.isUserError=i}},ue=class extends v{constructor(t="Operation cancelled"){super(t,"USER_CANCEL",!0)}};var Be=class extends v{constructor(t){super(t,"CONFIG_PARSE_ERROR",!0)}},rt=class extends v{constructor(){super("Roadmap file not found. Please create 'roadmap.json' or configure 'roadmap' in architext.json","ROADMAP_NOT_FOUND",!0)}},nt=class extends v{constructor(t){super(`Task [${t}] not found.`,"TASK_NOT_FOUND",!0)}},st=class extends v{constructor(t){super(`Invalid status: '${t}'. Valid values: pending, active, done, blocked`,"INVALID_TASK_STATUS",!0)}},be=class extends v{constructor(t){super(`Plan file not found for task [${t}]. Expected at: {docDir}/tasks/${t}_*/plan.json`,"PLAN_NOT_FOUND",!0)}},at=class extends v{issues;constructor(t){super(`Roadmap has ${t.length} inconsistencies.`,"ROADMAP_INCONSISTENCY",!0),this.issues=t}};import{z as V}from"zod";var qt=V.enum(["pending","active","done","blocked"]),Ht=V.object({id:V.string().min(1),title:V.string().min(1),status:qt,goal:V.string().optional(),deps:V.array(V.string()).optional(),tag:V.string().optional(),slug:V.string().optional()}),hi=V.object({id:V.string().min(1),name:V.string().min(1),tasks:V.array(Ht)}),ae=V.object({version:V.number(),projectStatus:V.string(),lastUpdated:V.string(),phases:V.array(hi)});import{z as O}from"zod";var vt=O.object({id:O.string().min(1),title:O.string().min(1),notes:O.string().optional(),done:O.boolean()}),ki=O.object({name:O.string().min(1),tasks:O.array(vt)}),_i=O.object({category:O.string(),choice:O.string(),rationale:O.string().optional()}),yi=O.object({automated:O.array(vt),manual:O.array(vt)}),Se=O.object({featureId:O.string().min(1),featureName:O.string().min(1),status:O.string(),decisions:O.array(_i),phases:O.array(ki),tests:yi});import{z as E}from"zod";var ct=E.record(E.string(),E.unknown()),Kt=E.object({entities:E.array(ct),verbs:E.array(ct)}).catchall(E.unknown()),Wt=E.object({businessErrors:E.array(ct)}).catchall(E.unknown()),Yt=E.object({models:E.array(ct)}).catchall(E.unknown()),Xt=E.object({semanticTokens:E.record(E.string(),E.unknown())}).catchall(E.unknown()),Zt=E.object({directoryMapping:E.array(E.unknown()).optional(),logicalTopology:E.array(E.unknown()).optional(),criticalUserJourneys:E.array(E.unknown()).optional(),featureRelations:E.array(E.unknown()).optional()}).catchall(E.unknown()),lt={"dictionary.json":Kt,"error_codes.json":Wt,"data_snapshot.json":Yt,"design_tokens.json":Xt,"map.json":Zt};import{z as K}from"zod";var wi=K.enum(["trae","cursor","windsurf","vscode","claude","opencode"]),xi=K.enum(["ui","data","cli","lib","api","mobile","desktop","extension","miniapp","realtime","ai"]),bi=K.enum(["zh","en"]),Dt=K.object({language:bi,docDir:K.string().min(1),features:K.array(xi).optional(),roadmap:K.string().optional(),editors:K.array(wi).min(1),version:K.string().optional(),structureVersion:K.number().int().positive().optional(),updatedAt:K.string().min(1),opencodeInstructionsAdded:K.boolean().optional(),opencodeNotifyAdded:K.boolean().optional(),claudeNotifyAdded:K.boolean().optional(),notify:K.boolean().optional()});function ve(e,t,o){try{return e.parse(t)}catch(i){if(i instanceof Si){let r=i.issues.map(n=>` - ${n.path.join(".")}: ${n.message}`).join(`
|
|
3
|
+
`);throw new v(`${o} schema validation failed:
|
|
4
|
+
${r}`,"SCHEMA_VALIDATION_ERROR",!0)}throw i}}var y=k(_(),"command.doctor");async function Qt(e){let t=[],o=Y.join(e,"architext.json");if(!await q.pathExists(o))return t.push({label:"architext.json",status:"fail",detail:y("check.config.not_found"),hint:y("check.config.hint_init")}),{config:null,results:t};t.push({label:"architext.json",status:"pass"});let i;try{i=await q.readJSON(o)}catch{return t.push({label:y("check.config.format_label"),status:"fail",detail:y("check.config.format_fail")}),{config:null,results:t}}t.push({label:y("check.config.format_label"),status:"pass"});let r=i.editors??[],n=r.filter(a=>!xe.includes(a));r.length===0?t.push({label:y("check.config.editors_label"),status:"warn",detail:y("check.config.editors_empty")}):n.length>0?t.push({label:y("check.config.editors_label"),status:"warn",detail:y("check.config.editors_invalid",{list:n.join(", ")})}):t.push({label:y("check.config.editors_ok",{list:r.join(", ")}),status:"pass"}),["zh","en"].includes(i.language)?t.push({label:y("check.config.lang_ok",{lang:i.language}),status:"pass"}):t.push({label:y("check.config.lang_label"),status:"warn",detail:y("check.config.lang_invalid",{lang:i.language})});let s=i.docDir||y("check.config.doc_dir_unset");return t.push({label:y("check.config.doc_dir",{dir:s}),status:i.docDir?"pass":"warn",detail:i.docDir?void 0:y("check.config.doc_dir_empty")}),{config:i,results:t}}async function eo(e,t){let o=[],i=await q.pathExists(Y.join(t,e.docDir));o.push(i?{label:`${e.docDir}/`,status:"pass"}:{label:`${e.docDir}/`,status:"fail",detail:y("check.dir.missing"),hint:y("check.dir.hint_init")});let r=Y.join(e.docDir,"global"),n=await q.pathExists(Y.join(t,r));o.push(n?{label:"global/",status:"pass"}:{label:"global/",status:"fail",detail:y("check.dir.missing"),hint:y("check.dir.hint_init")});let c=z(),s=Oe(c,e);for(let a of s.scaffoldDirs){let p=`${a.split("/").pop()}/`,d=await q.pathExists(Y.join(t,a));o.push(d?{label:p,status:"pass"}:{label:p,status:"warn",detail:y("check.dir.missing"),hint:y("check.dir.hint_tasks",{docDir:e.docDir})})}return o}function vi(e){let t=z(),o=new Set(e.features??[]),i=[];for(let r of t.globalSeeds){let n=typeof r=="string"?r:r.file;if(typeof r!="string"&&!o.has(r.feature))continue;let c=n==="roadmap.json",s=lt[n]?n:void 0;i.push({name:n,required:c,schemaKey:s})}return i}async function to(e,t){let o=[],i=Y.join(t,e.docDir,"global"),r=vi(e);for(let n of r){let c=Y.join(i,n.name);if(!await q.pathExists(c)){o.push({label:n.name,status:n.required?"fail":"warn",detail:n.required?y("check.global.required_missing"):y("check.global.optional_missing")});continue}if(!n.name.endsWith(".json")){o.push({label:n.name,status:"pass"});continue}let s;try{s=await q.readJSON(c)}catch{o.push({label:n.name,status:"fail",detail:y("check.global.parse_fail")});continue}if(n.name==="roadmap.json"){let a=ae.safeParse(s),p=s&&typeof s=="object"&&"version"in s?String(s.version):"?";o.push({label:a.success?y("check.global.roadmap_ok",{version:p}):"roadmap.json",status:a.success?"pass":"warn",detail:a.success?void 0:a.error.issues.map(d=>d.message).join("; "),hint:a.success?void 0:y("check.global.roadmap_hint")});continue}if(n.schemaKey){let p=lt[n.schemaKey].safeParse(s);o.push({label:n.name,status:p.success?"pass":"warn",detail:p.success?void 0:p.error.issues.map(d=>`${d.path.join(".")}: ${d.message}`).join("; ")});continue}o.push({label:n.name,status:"pass"})}return o}async function oo(e,t){if(e.editors.length===0)return[];let o=[],i=z(),r=Oe(i,e);for(let c of e.editors){let s=D[c];if(!s)continue;let a=Y.join(t,s.targetDir),p=await q.pathExists(a);if(o.push({label:`[${s.label}] ${s.targetDir}/`,status:p?"pass":"fail",detail:p?void 0:y("check.rules.dir_missing"),hint:p?void 0:y("check.rules.dir_hint")}),!!p)for(let d of i.rules){let m=`${d}${s.targetExt}`,C=await q.pathExists(Y.join(a,m));o.push({label:` ${m}`,status:C?"pass":"warn",detail:C?void 0:y("check.rules.file_missing"),hint:C?void 0:y("check.rules.file_hint")})}}let n=r.frameworkFiles.filter(c=>c.includes("archi."));for(let c of n){let s=await q.pathExists(Y.join(t,c)),a=` ${c.split("/").pop()}`;o.push({label:a,status:s?"pass":"warn",detail:s?void 0:y("check.rules.file_missing"),hint:s?void 0:y("check.rules.file_hint")})}for(let c of r.frameworkDirs){let s=await q.pathExists(Y.join(t,c)),a=` ${c.split("/").slice(-2).join("/")}`;o.push({label:a,status:s?"pass":"warn",detail:s?void 0:y("check.rules.file_missing"),hint:s?void 0:y("check.rules.file_hint")})}return o}async function io(e,t){let o=[];if(e.notify===!1)return o.push({label:y("check.notify.status"),status:"pass",detail:y("check.notify.disabled")}),o;if(e.editors.includes("claude")){let i=Y.join(t,".claude/settings.json"),r=!1;if(await q.pathExists(i))try{let c=(await q.readJSON(i)).hooks?.Stop;if(Array.isArray(c)){for(let s of c)if(Array.isArray(s.hooks)){for(let a of s.hooks)if(a.type==="command"&&a.command==="npx archi notify"){r=!0;break}}}}catch{}o.push({label:y("check.notify.claude_label"),status:r?"pass":"warn",detail:r?void 0:y("check.notify.not_configured"),hint:r?void 0:y("check.notify.hint_run_update")})}if(e.editors.includes("opencode")){let i=Y.join(t,".opencode/plugins/architext-notify.js"),r=!1;if(await q.pathExists(i)){let n=Y.join(t,"opencode.json");if(await q.pathExists(n))try{let s=(await q.readJSON(n)).plugins;Array.isArray(s)&&s.includes("./.opencode/plugins/architext-notify.js")&&(r=!0)}catch{}}o.push({label:y("check.notify.opencode_label"),status:r?"pass":"warn",detail:r?void 0:y("check.notify.not_configured"),hint:r?void 0:y("check.notify.hint_run_update")})}return o}var X=k(_(),"command.doctor"),Ei={pass:N.green("\u2713"),warn:N.yellow("\u26A0"),fail:N.red("\u2717")};function Ci(e){let t=Ei[e.status],o=e.status==="fail"?N.red(e.label):e.status==="warn"?N.yellow(e.label):e.label,i=e.detail?N.dim(` \u2014 ${e.detail}`):"";l.raw(` ${t} ${o}${i}`),e.hint&&l.raw(` ${N.dim(`\u2192 ${e.hint}`)}`)}function ro(e){l.raw(`
|
|
5
|
+
${N.bold(`\u25BA ${e.title}`)}`);for(let t of e.checks)Ci(t)}async function no(){l.clear(),Di(N.bgCyan(N.black(` ${X("title")} `)));let e=process.cwd(),t=[],{config:o,results:i}=await Qt(e);if(t.push({title:X("group.config"),checks:i}),!o){for(let R of t)ro(R);l.raw(""),pt(N.red(X("no_config")));return}let r=await eo(o,e);t.push({title:X("group.doc_structure"),checks:r});let n=await to(o,e);t.push({title:X("group.global_files"),checks:n});let c=await oo(o,e);c.length>0&&t.push({title:X("group.ide_rules"),checks:c});let s=await io(o,e);s.length>0&&t.push({title:X("group.ide_notify"),checks:s});for(let R of t)ro(R);let a=t.flatMap(R=>R.checks),p=a.filter(R=>R.status==="pass").length,d=a.filter(R=>R.status==="warn").length,m=a.filter(R=>R.status==="fail").length,C=[N.green(X("summary.passed",{n:p})),d>0?N.yellow(X("summary.warned",{n:d})):null,m>0?N.red(X("summary.failed",{n:m})):null].filter(Boolean).join(N.dim(" \xB7 "));l.raw(`
|
|
6
|
+
${N.dim("\u2500".repeat(48))}`),l.raw(X("summary.result",{parts:C})),m===0&&d===0?pt(N.green(X("success"))):m===0?pt(N.yellow(X("with_warnings"))):pt(N.red(X("with_errors")))}import{intro as Hi,outro as Pt}from"@clack/prompts";import ut from"picocolors";import Et from"fs-extra";import so from"path";var Ae="architext.json";function Pi(e){let t=e.issues.map(o=>` - ${o.path.length>0?o.path.join("."):"(root)"}: ${o.message}`).join(`
|
|
7
|
+
`);return`${Ae} schema validation failed:
|
|
8
|
+
${t}`}async function L(e=process.cwd()){let t=so.join(e,Ae);if(!await Et.pathExists(t))return null;let o;try{o=await Et.readJSON(t)}catch(r){throw r instanceof SyntaxError?new Be(`Failed to parse ${Ae}: ${r.message}`):r}let i=Dt.safeParse(o);if(!i.success)throw new Be(Pi(i.error));return i.data}async function ze(e,t=process.cwd()){let o=so.join(t,Ae),i={...e,updatedAt:new Date().toISOString()};await Et.writeJSON(o,i,{spaces:2})}import $e from"fs-extra";import S from"path";import me from"fs-extra";import De from"path";import{fileURLToPath as Ti}from"url";var ao=De.dirname(Ti(import.meta.url)),ji=k(_(),"templates"),B=class{static async getRoot(){let t=[De.join(ao,"templates"),De.resolve(ao,"../templates")];for(let o of t)if(await me.pathExists(o))return o;throw new v(ji("error.root_not_found",{paths:t.join(", ")}),"TEMPLATE_ROOT_NOT_FOUND")}static async plan(t,o,i={}){let r=[];if(!await me.pathExists(t))return r;let n=await me.readdir(t,{withFileTypes:!0});for(let c of n){let s=De.join(t,c.name),a=De.join(o,c.name);if(c.isDirectory()){let d=await this.plan(s,a,i);r.push(...d);continue}if(!c.isFile())continue;(this.shouldReplace(c.name)?"template":"copy")==="template"?r.push({src:s,dest:a,type:"template",replacements:i}):r.push({src:s,dest:a,type:"copy"})}return r}static async execute(t,o={}){for(let i of t)o.overwrite===!1&&await me.pathExists(i.dest)||(await me.ensureDir(De.dirname(i.dest)),i.type==="template"?await this.processFile(i.src,i.dest,i.replacements,i.resolver):await me.copy(i.src,i.dest))}static shouldReplace(t){let o=De.extname(t).toLowerCase();return[".md",".json",".ts",".js",".yaml",".yml"].includes(o)}static async processFile(t,o,i,r){let n=await me.readFile(t,"utf-8");for(let[c,s]of Object.entries(i)){let a=c.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),p=new RegExp(a,"g");n=n.replace(p,s)}r&&(n=r(n)),await me.writeFile(o,n,"utf-8")}};import Ie from"fs-extra";import qe from"path";async function co(e,t,o){let i=qe.join(e,G.PATHS.BRIEFS_SOURCE),r=qe.join(i,Jt);if(!await Ie.pathExists(r))return;let n=await Ie.readFile(r,"utf-8"),c=qe.join(i,Bt),s=await Ie.pathExists(c)?await Ie.readFile(c,"utf-8"):"",a=new Set(t),p=[],d=[],m=/<!-- @(tech|style):(\w+) -->\n([\s\S]*?)<!-- @end -->/g,C;for(;(C=m.exec(s))!==null;){let[,x,T,W]=C;if(!a.has(T))continue;let b=W.trimEnd();x==="tech"?p.push(b):x==="style"&&d.push(b)}n=n.replace("<!-- @slot:tech -->",p.join(`
|
|
9
|
+
`)),n=n.replace("<!-- @slot:style -->",d.length>0?d.join(`
|
|
10
10
|
|
|
11
11
|
`)+`
|
|
12
12
|
|
|
13
|
-
`:"");for(let[
|
|
13
|
+
`:"");for(let[x,T]of Object.entries(o)){let W=x.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");n=n.replace(new RegExp(W,"g"),T)}n=n.replace(/\n{3,}/g,`
|
|
14
14
|
|
|
15
|
-
`);let H=Le.join(process.cwd(),Lt);await Te.writeFile(H,s,"utf-8");let g=Le.join(process.cwd(),Ye);await Te.ensureDir(g)}import st from"fs-extra";import br from"path";async function vr(){let e=br.join(process.cwd(),"opencode.json"),t=".opencode/rules/*.md";if(await st.pathExists(e))try{let o=JSON.parse(await st.readFile(e,"utf-8")),i=o.instructions;if(Array.isArray(i)){if(i.includes(t))return!1;i.push(t)}else o.instructions=[t];return await st.writeFile(e,JSON.stringify(o,null,2),"utf-8"),!0}catch{return!1}return await st.writeFile(e,JSON.stringify({instructions:[t]},null,2),"utf-8"),!0}async function eo(e){return{opencodeInstructionsAdded:e.includes("opencode")?await vr():!1}}var Ne=h(_(),"scaffold");function to(e,t){return o=>Ie(o,{hasSkills:!!e.skills,hasSubagents:!!e.subagents},t)}function Dr(e,t){let o=e.some(r=>!!E[r]?.skills),i=e.some(r=>!!E[r]?.subagents);return r=>Ie(r,{hasSkills:o,hasSubagents:i},t)}async function oo(e,t){return await Ce.pathExists(v.join(e,t))?t:"zh"}async function xt(e){let{language:t,docDir:o,editors:i,features:r=[]}=e,s=await N.getRoot(),c=await oo(s,t),n=v.join(s,c),a=process.cwd(),p=v.resolve(a,o),d=v.join(n,F.PATHS.DOCS_SOURCE),k=M(),x=new Set(r),H=r.length>0?r.join(", "):"\u672A\u6307\u5B9A",g={[F.PLACEHOLDERS.DOCS_DIR]:o,[F.PLACEHOLDERS.PROJECT_TYPE]:H},D=[],B=[],z=v.join(n,F.PATHS.RULES_SOURCE);for(let C of i){let $=E[C];if(!$)continue;let te={...g,[F.PLACEHOLDERS.PROMPTS_PATH]:It(C,o)},W=to($,d),me=v.join(a,$.targetDir);for(let ue of k.rules)D.push({src:v.join(z,`${ue}.md`),dest:v.join(me,`${ue}${$.targetExt}`),type:"template",replacements:te,resolver:W,group:"ide"})}let de=v.join(n,F.PATHS.PROMPTS_SOURCE);for(let C of i){let $=E[C];if(!$)continue;let te=to($,d);for(let W of k.prompts){let me=v.join(de,`${W}.md`),ue=$.commands?v.join(a,$.commands.targetDir,`archi.${W}.md`):v.join(p,"prompts",C,`archi.${W}.md`);D.push({src:me,dest:ue,type:"template",replacements:g,resolver:te,group:"ide"})}}let Ke=v.join(n,F.PATHS.SKILLS_SOURCE);for(let C of i){let $=E[C];if($?.skills)for(let te of k.skills){let W=v.join(Ke,te),me=v.join(a,$.skills.targetDir,te);if(await Ce.pathExists(W)){let ue=await N.plan(W,me,g);ue.forEach(Xo=>Xo.group="ide"),D.push(...ue)}}}if(i.some(C=>!E[C]?.skills))for(let C of k.skills){let $=v.join(Ke,C),te=v.join(p,F.PATHS.SKILLS_DOC_TARGET,C);if(await Ce.pathExists($)){let W=await N.plan($,te,g);W.forEach(me=>me.group="docs"),D.push(...W)}}let Yo=v.join(n,"docs","templates"),Zo=Dr(i,d);for(let C of k.docTemplates)D.push({src:v.join(Yo,C),dest:v.join(p,"templates",C),type:"template",replacements:g,resolver:Zo,group:"docs"});let Qo=v.join(n,"docs","global");for(let C of k.globalSeeds){let $=typeof C=="string"?C:C.file;typeof C!="string"&&!x.has(C.feature)||B.push({src:v.join(Qo,$),dest:v.join(p,"global",$),type:"template",replacements:g,group:"docs"})}return{frameworkOps:D,seedOps:B}}async function ro(e,t){let{language:o,docDir:i,editors:r,features:s=[]}=e,c=await N.getRoot(),n=await oo(c,o);n!==o&&l.warn(Ne("fallback",{lang:o}));let{frameworkOps:a,seedOps:p}=await xt(e),d=[...a,...p],k=t?.resolveConflicts?await t.resolveConflicts(d):d,x=["docs","ide"],H={docs:Ne("step_docs"),ide:Ne("step_ide")};for(let z of x){let de=k.filter(Ke=>Ke.group===z);de.length>0&&(l.step(H[z]||Ne("step_processing",{group:z})),await N.execute(de))}let g=k.filter(z=>!z.group);g.length>0&&await N.execute(g);let D=v.resolve(process.cwd(),i);if(await Ce.ensureDir(v.join(D,"scripts")),await Ce.ensureDir(v.join(D,"tasks")),await Ce.ensureDir(v.join(D,"refs")),e.generateBrief!==!1){let z=v.join(c,n);await Xt(z,s,{[F.PLACEHOLDERS.DOCS_DIR]:i,[F.PLACEHOLDERS.PROJECT_TYPE]:s.length>0?s.join(", "):"\u672A\u6307\u5B9A"})}let{opencodeInstructionsAdded:B}=await eo(r);return l.success(Ne("complete")),{opencodeInstructionsAdded:B}}import{select as Er}from"@clack/prompts";import Tr from"fs-extra";import io from"path";var Re=h(_(),"command.init"),Ue=class{static async resolve(t){let o=await this.detectConflicts(t);if(o.length===0)return t;let i=await this.promptAction(o);if(i==="cancel")throw new se(Re("cancel"));if(i==="overwrite")return t;if(i==="skip"){let r=new Set(o);return t.filter(s=>!r.has(io.relative(process.cwd(),s.dest)))}return t}static async detectConflicts(t){let o=await Promise.all(t.map(i=>Tr.pathExists(i.dest)));return t.filter((i,r)=>o[r]).map(i=>io.relative(process.cwd(),i.dest))}static async promptAction(t){l.warn(Re("conflict_title")),t.forEach(i=>l.info(` - ${i}`));let o=await Er({message:Re("conflict_msg"),options:[{value:"overwrite",label:Re("conflict_overwrite")},{value:"skip",label:Re("conflict_skip")},{value:"cancel",label:Re("conflict_cancel")}]});return typeof o=="symbol"?"cancel":o}};import{confirm as so,isCancel as Me,multiselect as no,select as Cr}from"@clack/prompts";var Ge=h(_(),"command.init");async function Rr(e){if(!e)return!0;let t=await so({message:Ge("config_exists")});return!(Me(t)||!t)}async function Pr(e,t){let o=Object.keys(gt);if(e&&o.includes(e))return e;let i=await Cr({message:Ge("select_lang"),options:Object.entries(gt).map(([r,s])=>({value:r,label:s.label})),initialValue:t?.language??"zh"});return Me(i)?null:i}async function jr(e){if(e){let i=e.split(",").map(r=>r.trim()).filter(r=>fe.includes(r));if(i.length>0)return i}let t=await no({message:Ge("select_editor"),options:fe.map(o=>({value:o,label:E[o].label})),required:!0});return Me(t)?null:t}async function Or(){let e=await so({message:Ge("select_generate_brief"),initialValue:!0});return Me(e)?null:e}async function Ar(e){if(e){let o=e.split(",").map(s=>s.trim()),i=ht.map(s=>s.value),r=o.filter(s=>i.includes(s));if(r.length>0)return r}let t=await no({message:Ge("select_features"),options:ht.map(o=>({value:o.value,label:o.label,hint:o.hint})),required:!0});return Me(t)?null:t}async function ao(e){let t=await A();if(!e.yes){if(!await Rr(t))return null}let o=await Pr(e.language,t);if(!o)return null;let i=await jr(e.editor);if(!i)return null;let r=await Ar(e.type);if(!r)return null;let s;if(e.brief!==void 0)s=e.brief;else{let n=await Or();if(n===null)return null;s=n}let c=e.doc||t?.docDir||".architext";return{language:o,editors:i,docDir:c,features:r,generateBrief:s}}var at=h(_(),"command.init");async function co(e){l.clear(),Ir(nt.bgCyan(nt.black(` ${at("title")} `)));let t=await ao(e);if(!t){yt(nt.yellow(at("cancel")));return}let o=await A();await Fe({...o??{},...t});try{let i=await ro(t,{resolveConflicts:Ue.resolve.bind(Ue)}),r=await A();await Fe({...t,...r??{},structureVersion:ie,...i?.opencodeInstructionsAdded&&{opencodeInstructionsAdded:!0}})}catch(i){if(i instanceof se){yt(nt.yellow(at("cancel")));return}throw i}yt(at("success"))}import{intro as $r,outro as St,spinner as Fr}from"@clack/prompts";import we from"fs-extra";import Pe from"picocolors";import Ve from"fs-extra";import U from"path";function lo(e,t){let o=M(),i=Ze(o,e.docDir),r=[],s=[],c=new Set;for(let a of i.frameworkFiles)r.push(U.resolve(t,a)),c.add(U.dirname(U.resolve(t,a)));for(let a of i.frameworkDirs){s.push(U.resolve(t,a));let p=U.dirname(U.resolve(t,a));c.add(p),c.add(U.dirname(p))}s.push(U.resolve(t,e.docDir)),r.push(U.resolve(t,"project-brief.md")),s.push(U.resolve(t,Ye)),r.push(U.resolve(t,Ee));for(let a of i.frameworkFiles){let p=U.dirname(U.resolve(t,a));c.add(p),c.add(U.dirname(p))}let n=Array.from(c).filter(a=>a!==t).sort((a,p)=>p.split(U.sep).length-a.split(U.sep).length);return{files:r,dirs:s,dirsToCheck:n}}async function po(e,t){if(!e.editors?.includes("opencode")||!e.opencodeInstructionsAdded)return;let o=U.resolve(t,"opencode.json"),i=".opencode/rules/*.md";if(await Ve.pathExists(o))try{let r=JSON.parse(await Ve.readFile(o,"utf-8"));if(!Array.isArray(r.instructions))return;let s=r.instructions.filter(c=>c!==i);if(s.length===r.instructions.length)return;s.length===0?(delete r.instructions,Object.keys(r).length===0?await Ve.remove(o):await Ve.writeFile(o,JSON.stringify(r,null,2),"utf-8")):(r.instructions=s,await Ve.writeFile(o,JSON.stringify(r,null,2),"utf-8"))}catch{}}var xe=h(_(),"command.uninstall"),mo=async()=>{l.clear(),$r(Pe.bgRed(Pe.black(` ${xe("title")} `)));let e=process.cwd(),t=await A(e);if(!t){St(Pe.yellow(xe("not_found")));return}let o=lo(t,e);if(o.files.length+o.dirs.length===0){St(Pe.green(xe("success")));return}let r=Fr();r.start(xe("cleaning"));try{await po(t,e);for(let s of o.files)await we.pathExists(s)&&await we.remove(s);for(let s of o.dirs)await we.pathExists(s)&&await we.remove(s);for(let s of o.dirsToCheck){if(s===e||!await we.pathExists(s))continue;(await we.readdir(s)).length===0&&await we.remove(s)}r.stop(xe("done")),St(Pe.green(xe("success")))}catch(s){r.stop(Pe.red(xe("error")));let c=s instanceof Error?s.message:String(s);throw new b(c)}};import{confirm as Nr,intro as Ur,isCancel as Mr,outro as ze,spinner as Gr}from"@clack/prompts";import V from"picocolors";import ye from"fs-extra";import Be from"path";var uo=[];var bt=h(_(),"command.update");async function fo(e,t){let o=Be.join(t,e.docDir,"global","roadmap.json"),i=Be.relative(t,o);if(!await ye.pathExists(o))return{file:i,compatible:!0,migrated:!1};let r;try{r=await ye.readJSON(o)}catch{return{file:i,compatible:!1,migrated:!1,errors:[bt("schema.parse_error")]}}let s=typeof r.version=="number"?r.version:0;if(s>1)return{file:i,compatible:!1,migrated:!1,fromVersion:s,errors:[bt("schema.version_too_new",{current:s,expected:1})]};if(s===1){let a=X.safeParse(r);return a.success?{file:i,compatible:!0,migrated:!1}:{file:i,compatible:!1,migrated:!1,errors:a.error.issues.map(p=>`${p.path.join(".")}: ${p.message}`)}}let c=uo.filter(a=>a.fromVersion>=s&&a.fromVersion<1).sort((a,p)=>a.fromVersion-p.fromVersion),n=r;for(let a of c)n=a.migrate(n);return n.version=1,await ye.writeJSON(o,n,{spaces:2}),{file:i,compatible:!0,migrated:!0,fromVersion:s,toVersion:1}}async function go(e,t){let o=Be.join(t,e.docDir,"tasks"),i=[];if(!await ye.pathExists(o))return i;let r;try{r=await ye.readdir(o)}catch{return i}for(let s of r){let c=Be.join(o,s,"plan.json"),n=Be.relative(t,c);if(!await ye.pathExists(c))continue;let a;try{a=await ye.readJSON(c)}catch{i.push({file:n,compatible:!1,errors:[bt("schema.parse_error")]});continue}let p=he.safeParse(a);p.success?i.push({file:n,compatible:!0}):i.push({file:n,compatible:!1,errors:p.error.issues.map(d=>`${d.path.join(".")}: ${d.message}`)})}return i}import G from"fs-extra";import P from"path";function ho(e,t){let o=new Set;for(let i of e){let r=E[i];if(r)for(let s of Object.keys(t))o.add(`${r.targetDir}/${s}${r.targetExt}`.replace(/\\/g,"/"))}return o}async function ko(e,t){let o=M(),i=Ze(o,e.docDir),r=De(o,e),s=new Set([...r.frameworkFiles,...r.frameworkDirs]),c=ho(Object.keys(E),o.rulePolicy),n=0;for(let d of i.frameworkFiles){if(s.has(d)||c.has(d))continue;let k=P.resolve(t,d);await G.pathExists(k)&&(await G.remove(k),n++)}for(let d of i.frameworkDirs){if(s.has(d))continue;let k=P.resolve(t,d);await G.pathExists(k)&&(await G.remove(k),n++)}let a=new Set;for(let d of i.frameworkFiles)a.add(P.dirname(P.resolve(t,d)));for(let d of i.frameworkDirs){let k=P.dirname(P.resolve(t,d));a.add(k),a.add(P.dirname(k))}let p=Array.from(a).filter(d=>d!==t).sort((d,k)=>k.split(P.sep).length-d.split(P.sep).length);for(let d of p){if(!await G.pathExists(d))continue;(await G.readdir(d)).length===0&&await G.remove(d)}return n}async function _o(e,t){let o=M(),i=ho(e.editors,o.rulePolicy),r=await xt({language:e.language,editors:e.editors,docDir:e.docDir,features:e.features??[],generateBrief:!1}),s=r.frameworkOps.filter(d=>{let k=P.relative(t,d.dest).replace(/\\/g,"/");return!i.has(k)});for(let d of["docs","ide"]){let k=s.filter(x=>x.group===d);k.length>0&&await N.execute(k)}let c=s.filter(d=>!d.group);c.length>0&&await N.execute(c);let n=0,a=[];for(let d of r.seedOps)await G.pathExists(d.dest)||(a.push(d),n++);a.length>0&&await N.execute(a);let p=P.resolve(t,e.docDir);return await G.ensureDir(P.join(p,"scripts")),await G.ensureDir(P.join(p,"tasks")),await G.ensureDir(P.join(p,"refs")),{frameworkCount:s.length,seedCount:n}}async function wo(e){let t=M(),o=Object.entries(t.rulePolicy).filter(([,g])=>g==="templateOnly").map(([g])=>g);if(o.length===0)return[];let i=await N.getRoot(),r=await G.pathExists(P.join(i,e.language))?e.language:"zh",s=P.join(i,r),c=P.join(s,F.PATHS.RULES_SOURCE),n=P.join(s,F.PATHS.DOCS_SOURCE),a=e.features&&e.features.length>0?e.features.join(", "):"\u672A\u6307\u5B9A",p={[F.PLACEHOLDERS.DOCS_DIR]:e.docDir,[F.PLACEHOLDERS.PROJECT_TYPE]:a},d=e.editors.some(g=>!!E[g]?.skills),k=e.editors.some(g=>!!E[g]?.subagents),x=g=>Ie(g,{hasSkills:d,hasSubagents:k},n),H=[];for(let g of o){let D=P.join(c,`${g}.md`);if(!await G.pathExists(D))continue;let B=P.join(process.cwd(),e.docDir,"templates",`${g}.template.md`);await G.ensureDir(P.dirname(B)),await N.processFile(D,B,p,x),H.push(g)}return H}async function xo(){try{let e=await fetch("https://registry.npmjs.org/architext/latest",{signal:AbortSignal.timeout(5e3)});if(!e.ok)return null;let o=(await e.json()).version,i=oe.version;return{current:i,latest:o,isOutdated:Lr(o,i)>0}}catch{return null}}function Lr(e,t){let o=e.split(".").map(Number),i=t.split(".").map(Number);for(let r=0;r<3;r++){let s=(o[r]??0)-(i[r]??0);if(s!==0)return s}return 0}var w=h(_(),"command.update");async function yo(){l.clear(),Ur(V.bgCyan(V.black(` ${w("title")} `)));let e=process.cwd(),t=await A(e);if(!t){ze(V.yellow(w("no_config")));return}let o=Gr();o.start(w("version_checking"));let i=await xo();if(i?i.isOutdated?(o.stop(V.yellow(w("version_outdated",{current:i.current,latest:i.latest}))),l.info(w("version_upgrade_hint",{cmd:`npm install -g architext@${i.latest}`}))):o.stop(V.green(w("version_up_to_date",{version:i.current}))):o.stop(V.dim(w("version_check_skip"))),t.structureVersion==null){l.dim(""),l.warn(w("legacy_migration_blocked")),l.dim(w("legacy_migration_step1")),l.dim(w("legacy_migration_step2")),l.dim(w("legacy_migration_step3")),l.dim(w("legacy_migration_step4")),ze(V.yellow(w("cancel")));return}if(t.structureVersion>ie){l.dim(""),l.warn(w("version_too_new",{project:t.structureVersion,cli:ie})),ze(V.yellow(w("cancel")));return}let r=M(),s=Object.entries(r.rulePolicy).filter(([,g])=>g==="neverTouch").map(([g])=>g),c=Object.entries(r.rulePolicy).filter(([,g])=>g==="templateOnly").map(([g])=>g);l.warn(w("update_warning")),l.dim(w("update_skip_hint",{list:[...s,...c].join(", ")})),l.dim(w("update_global_hint"));let n=await Nr({message:w("update_confirm")});if(Mr(n)||!n){ze(V.yellow(w("cancel")));return}o.start(w("removing_old"));let a=0;try{a=await ko(t,e)}catch(g){throw o.stop(V.red(w("failed"))),new b(g instanceof Error?g.message:String(g))}o.stop(V.green(w("removed_old",{count:a}))),o.start(w("deploying_new"));let p=0,d=0;try{({frameworkCount:p,seedCount:d}=await _o(t,e))}catch(g){throw o.stop(V.red(w("failed"))),new b(g instanceof Error?g.message:String(g))}o.stop(V.green(w("deployed_new",{framework:p,seeds:d})));let k=await wo(t);l.dim(""),l.step(w("schema_auditing"));let x=await fo(t,e),H=await go(t,e);if(x.compatible?x.migrated?l.success(w("schema.roadmap_migrated",{file:x.file,from:x.fromVersion??0,to:x.toVersion??1})):l.success(w("schema.roadmap_ok",{file:x.file})):(l.fail(w("schema.roadmap_error",{file:x.file})),x.errors?.forEach(g=>l.dim(` ${g}`))),H.length===0)l.dim(w("schema.no_plans"));else{let g=H.filter(D=>!D.compatible);g.length===0?l.success(w("schema.plans_ok",{count:H.length})):g.forEach(D=>{l.fail(w("schema.plan_error",{file:D.file})),D.errors?.forEach(B=>l.dim(` ${B}`))})}l.dim(""),l.step(w("summary")),l.done(w("summary_framework",{count:p})),d>0&&l.info(w("summary_seeds",{count:d})),k.length>0&&l.info(w("summary_templated",{docDir:t.docDir})),s.length>0&&l.dim(w("summary_skipped",{list:s.join(", ")})),l.dim(w("summary_global")),await Fe({...t,structureVersion:ie},e),ze(V.green(w("success")))}import Jr from"fs-extra";import Je from"picocolors";function So(e,t,o){let i=h(_(),"command.plan");if(l.info(""),l.info(Je.bold(`\u{1F4CB} ${i("title",{id:e,name:t})}`)),l.info(""),o.sections.length===0){l.warn(i("empty"));return}let r=0,s=0;for(let n of o.sections){let a=n.done===n.total;if(n.isManual)l.dim(`${n.name.padEnd(36)} ${i("section_manual",{done:n.done,total:n.total})}`);else{r+=n.total,s+=n.done;let p=a?Je.green("\u2705"):Je.yellow("\u26A0\uFE0F"),d=i("section_pass",{done:n.done,total:n.total});if(l.info(`${n.name.padEnd(36)} ${a?Je.green(d):Je.yellow(d)} ${p}`),!a)for(let k of n.items)k.done||l.error(` - ${k.id}: ${k.title}`)}}l.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500");let c=r>0?Math.round(s/r*100):0;l.info(i("total",{done:s,total:r,percent:c})),s===r&&r>0?l.success(i("all_done")):r>0&&l.warn(i("remaining",{count:r-s})),l.info("")}var Vr=["manual verification","manual check","manual","\u4EBA\u5DE5\u9A8C\u6536","\u624B\u52A8\u9A8C\u8BC1","\u624B\u52D5\u9A57\u8B49","\u4EBA\u5DE5\u9A57\u6536"];function bo(e){let t=[];for(let o of e.phases){let i=Vr.some(r=>o.name.toLowerCase().includes(r));t.push({name:o.name,isManual:i,items:o.tasks,done:o.tasks.filter(r=>r.done).length,total:o.tasks.length})}return e.tests&&(e.tests.automated&&e.tests.automated.length>0&&t.push({name:"Automated Tests",isManual:!1,items:e.tests.automated,done:e.tests.automated.filter(o=>o.done).length,total:e.tests.automated.length}),e.tests.manual&&e.tests.manual.length>0&&t.push({name:"Manual Verification",isManual:!0,items:e.tests.manual,done:e.tests.manual.filter(o=>o.done).length,total:e.tests.manual.length})),{sections:t}}import vt from"fs-extra";import Eo from"path";import vo from"fs-extra";import Do from"path";var Br=[".architext"];async function ce(e=process.cwd()){let t=await A(e);if(t?.docDir){let o=Do.resolve(e,t.docDir);if(await vo.pathExists(o))return o}for(let o of Br){let i=Do.resolve(e,o);if(await vo.pathExists(i))return i}return null}var zr="plan.json";async function To(e,t=process.cwd()){let o=await ce(t);if(!o)throw new ge(e);let i=Eo.join(o,"tasks");if(!await vt.pathExists(i))throw new ge(e);let s=(await vt.readdir(i)).find(a=>a.startsWith(`${e}_`));if(!s)throw new ge(e);let c=Eo.join(i,s,zr);if(!await vt.pathExists(c))throw new ge(e);let n=s.replace(`${e}_`,"").replace(/_/g," ");return{filePath:c,featureName:n}}async function Co(e){if(!e){let c=h(_(),"plan");throw new b(c("id_required"),"PLAN_ID_REQUIRED",!0)}let{filePath:t,featureName:o}=await To(e),i=await Jr.readJSON(t),r=ke(he,i,`${e}/plan.json`),s=bo(r);So(e,o,s)}import le from"fs-extra";import qe from"path";var qr={pending:" ",active:" ",done:"x",blocked:" "},Hr={pending:"\u23F3",active:"\u{1F7E2}",done:"\u2705",blocked:"\u{1F9F1}"},Kr={pending:"pending",active:"active",done:"done",blocked:"blocked"};function Dt(e){return e.replace(/"/g,"#quot;")}function Wr(e){return e.replace(/([;;.。])\s*/g,"$1<br/>").trimEnd().replace(/<br\/>$/,"")}function Yr(e){let t=Dt(e.id),o=Dt(e.title);if(e.goal){let i=Wr(Dt(e.goal));return`"<b>[${t}] ${o}</b><br/>${i}"`}return`"<b>[${t}] ${o}</b>"`}function Ro(e,t="zh"){let o=h(t,"command.render"),r=[o("roadmap.header_comment")+`
|
|
15
|
+
`);let R=qe.join(process.cwd(),zt);await Ie.writeFile(R,n,"utf-8");let M=qe.join(process.cwd(),ot);await Ie.ensureDir(M)}import A from"fs-extra";import fe from"path";var Oi=`/**
|
|
16
|
+
* Architext \u684C\u9762\u901A\u77E5\u63D2\u4EF6
|
|
17
|
+
* \u5728\u4F1A\u8BDD\u7A7A\u95F2\u65F6\u89E6\u53D1 npx archi notify
|
|
18
|
+
*/
|
|
19
|
+
export const architextNotify = async ({ $ }) => {
|
|
20
|
+
return {
|
|
21
|
+
event: async ({ event }) => {
|
|
22
|
+
if (event.type === "session.idle") {
|
|
23
|
+
await $\`npx archi notify\`;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
`;async function Ai(){let e=fe.join(process.cwd(),"opencode.json"),t=".opencode/rules/*.md";if(await A.pathExists(e))try{let o=JSON.parse(await A.readFile(e,"utf-8")),i=o.instructions;if(Array.isArray(i)){if(i.includes(t))return!1;i.push(t)}else o.instructions=[t];return await A.writeFile(e,JSON.stringify(o,null,2),"utf-8"),!0}catch{return!1}return await A.writeFile(e,JSON.stringify({instructions:[t]},null,2),"utf-8"),!0}async function Ii(){let e=fe.join(process.cwd(),".opencode/plugins"),t=fe.join(e,"architext-notify.js");return await A.pathExists(t)?!1:(await A.ensureDir(e),await A.writeFile(t,Oi,"utf-8"),!0)}async function $i(){let e=fe.join(process.cwd(),"opencode.json"),t=fe.join(process.cwd(),".opencode/plugins/architext-notify.js"),o=".opencode/rules/*.md";if(await A.pathExists(t)&&await A.remove(t),!!await A.pathExists(e))try{let i=JSON.parse(await A.readFile(e,"utf-8")),r=!1;if(Array.isArray(i.instructions)){let n=i.instructions.filter(c=>c!==o);n.length!==i.instructions.length&&(n.length===0?delete i.instructions:i.instructions=n,r=!0)}if(!r)return;Object.keys(i).length===0?await A.remove(e):await A.writeFile(e,JSON.stringify(i,null,2),"utf-8")}catch{}}async function Fi(){let e=fe.join(process.cwd(),".claude/settings.json");await A.ensureDir(fe.dirname(e));let t={};if(await A.pathExists(e))try{t=JSON.parse(await A.readFile(e,"utf-8"))}catch{t={}}return t.hooks||(t.hooks={}),t.hooks.Stop||(t.hooks.Stop=[]),t.hooks.Stop.some(i=>i.hooks.some(r=>r.type==="command"&&r.command==="npx archi notify"))?!1:(t.hooks.Stop.push({hooks:[{type:"command",command:"npx archi notify"}]}),await A.writeFile(e,JSON.stringify(t,null,2),"utf-8"),!0)}async function Ni(){let e=fe.join(process.cwd(),".claude/settings.json");if(await A.pathExists(e))try{let t=JSON.parse(await A.readFile(e,"utf-8"));if(!t.hooks?.Stop)return;let o=t.hooks.Stop.length;if(t.hooks.Stop=t.hooks.Stop.filter(i=>!i.hooks.some(r=>r.type==="command"&&r.command==="npx archi notify")),t.hooks.Stop.length===o)return;t.hooks.Stop.length===0&&delete t.hooks.Stop,Object.keys(t.hooks).length===0&&delete t.hooks,Object.keys(t).length===0?await A.remove(e):await A.writeFile(e,JSON.stringify(t,null,2),"utf-8")}catch{}}async function dt(e,t=!0){let o={opencodeInstructionsAdded:!1,opencodeNotifyAdded:!1,claudeNotifyAdded:!1};return e.includes("opencode")&&(o.opencodeInstructionsAdded=await Ai(),t&&(o.opencodeNotifyAdded=await Ii())),t&&e.includes("claude")&&(o.claudeNotifyAdded=await Fi()),o}async function lo(e){e.includes("opencode")&&await $i(),e.includes("claude")&&await Ni()}var He=k(_(),"scaffold");function po(e,t){return o=>Je(o,{hasSkills:!!e.skills,hasSubagents:!!e.subagents,hasCommands:!!e.commands},t)}function Li(e,t){let o=e.some(n=>!!D[n]?.skills),i=e.some(n=>!!D[n]?.subagents),r=e.some(n=>!!D[n]?.commands);return n=>Je(n,{hasSkills:o,hasSubagents:i,hasCommands:r},t)}async function uo(e,t){return await $e.pathExists(S.join(e,t))?t:"zh"}async function Ct(e){let{language:t,docDir:o,editors:i,features:r=[]}=e,n=await B.getRoot(),c=await uo(n,t),s=S.join(n,c),a=process.cwd(),p=S.resolve(a,o),d=S.join(s,G.PATHS.DOCS_SOURCE),m=z(),C=new Set(r),R=r.length>0?r.join(", "):"\u672A\u6307\u5B9A",M={[G.PLACEHOLDERS.DOCS_DIR]:o,[G.PLACEHOLDERS.PROJECT_TYPE]:R},x=[],T=[],W=S.join(s,G.PATHS.RULES_SOURCE);for(let P of i){let U=D[P];if(!U)continue;let le={...M,[G.PLACEHOLDERS.PROMPTS_PATH]:Vt(P,o)},ie=po(U,d),ye=S.join(a,U.targetDir);for(let we of m.rules)x.push({src:S.join(W,`${we}.md`),dest:S.join(ye,`${we}${U.targetExt}`),type:"template",replacements:le,resolver:ie,group:"ide"})}let b=S.join(s,G.PATHS.PROMPTS_SOURCE);for(let P of i){let U=D[P];if(!U)continue;let le=po(U,d);for(let ie of m.prompts){let ye=S.join(b,`${ie}.md`),we=U.commands?S.join(a,U.commands.targetDir,`archi.${ie}.md`):S.join(p,"prompts",P,`archi.${ie}.md`);x.push({src:ye,dest:we,type:"template",replacements:M,resolver:le,group:"ide"})}}let te=S.join(s,G.PATHS.SKILLS_SOURCE);for(let P of i){let U=D[P];if(U?.skills)for(let le of m.skills){let ie=S.join(te,le),ye=S.join(a,U.skills.targetDir,le);if(await $e.pathExists(ie)){let we=await B.plan(ie,ye,M);we.forEach(li=>li.group="ide"),x.push(...we)}}}if(i.some(P=>!D[P]?.skills))for(let P of m.skills){let U=S.join(te,P),le=S.join(p,G.PATHS.SKILLS_DOC_TARGET,P);if(await $e.pathExists(U)){let ie=await B.plan(U,le,M);ie.forEach(ye=>ye.group="docs"),x.push(...ie)}}let F=S.join(s,"docs","templates"),ce=Li(i,d);for(let P of m.docTemplates)x.push({src:S.join(F,P),dest:S.join(p,"templates",P),type:"template",replacements:M,resolver:ce,group:"docs"});let ai=S.join(s,"docs","global");for(let P of m.globalSeeds){let U=typeof P=="string"?P:P.file;typeof P!="string"&&!C.has(P.feature)||T.push({src:S.join(ai,U),dest:S.join(p,"global",U),type:"template",replacements:M,group:"docs"})}let ci=S.join(s,"docs","global","references");for(let P of m.globalDocs)x.push({src:S.join(ci,P),dest:S.join(p,"global","references",P),type:"template",replacements:M,resolver:ce,group:"docs"});return{frameworkOps:x,seedOps:T}}async function mo(e,t){let{language:o,docDir:i,editors:r,features:n=[],notify:c=!0}=e,s=await B.getRoot(),a=await uo(s,o);a!==o&&l.warn(He("fallback",{lang:o}));let{frameworkOps:p,seedOps:d}=await Ct(e),m=[...p,...d],C=t?.resolveConflicts?await t.resolveConflicts(m):m,R=["docs","ide"],M={docs:He("step_docs"),ide:He("step_ide")};for(let ee of R){let F=C.filter(ce=>ce.group===ee);F.length>0&&(l.step(M[ee]||He("step_processing",{group:ee})),await B.execute(F))}let x=C.filter(ee=>!ee.group);x.length>0&&await B.execute(x);let T=S.resolve(process.cwd(),i);if(await $e.ensureDir(S.join(T,"scripts")),await $e.ensureDir(S.join(T,"tasks")),await $e.ensureDir(S.join(T,"refs")),e.generateBrief!==!1){let ee=S.join(s,a);await co(ee,n,{[G.PLACEHOLDERS.DOCS_DIR]:i,[G.PLACEHOLDERS.PROJECT_TYPE]:n.length>0?n.join(", "):"\u672A\u6307\u5B9A"})}let{opencodeInstructionsAdded:W,opencodeNotifyAdded:b,claudeNotifyAdded:te}=await dt(r,c);return l.success(He("complete")),{opencodeInstructionsAdded:W,opencodeNotifyAdded:b,claudeNotifyAdded:te}}import{select as Mi}from"@clack/prompts";import Ui from"fs-extra";import fo from"path";var Fe=k(_(),"command.init"),Ke=class{static async resolve(t){let o=await this.detectConflicts(t);if(o.length===0)return t;let i=await this.promptAction(o);if(i==="cancel")throw new ue(Fe("cancel"));if(i==="overwrite")return t;if(i==="skip"){let r=new Set(o);return t.filter(n=>!r.has(fo.relative(process.cwd(),n.dest)))}return t}static async detectConflicts(t){let o=await Promise.all(t.map(i=>Ui.pathExists(i.dest)));return t.filter((i,r)=>o[r]).map(i=>fo.relative(process.cwd(),i.dest))}static async promptAction(t){l.warn(Fe("conflict_title")),t.forEach(i=>l.info(` - ${i}`));let o=await Mi({message:Fe("conflict_msg"),options:[{value:"overwrite",label:Fe("conflict_overwrite")},{value:"skip",label:Fe("conflict_skip")},{value:"cancel",label:Fe("conflict_cancel")}]});return typeof o=="symbol"?"cancel":o}};import{confirm as go,isCancel as We,multiselect as ho,select as Gi}from"@clack/prompts";var Ye=k(_(),"command.init");async function Vi(e){if(!e)return!0;let t=await go({message:Ye("config_exists")});return!(We(t)||!t)}async function Ji(e,t){let o=Object.keys(xt);if(e&&o.includes(e))return e;let i=await Gi({message:Ye("select_lang"),options:Object.entries(xt).map(([r,n])=>({value:r,label:n.label})),initialValue:t?.language??"zh"});return We(i)?null:i}async function Bi(e){if(e){let i=e.split(",").map(r=>r.trim()).filter(r=>xe.includes(r));if(i.length>0)return i}let t=await ho({message:Ye("select_editor"),options:xe.map(o=>({value:o,label:D[o].label})),required:!0});return We(t)?null:t}async function zi(){let e=await go({message:Ye("select_generate_brief"),initialValue:!0});return We(e)?null:e}async function qi(e){if(e){let o=e.split(",").map(n=>n.trim()),i=bt.map(n=>n.value),r=o.filter(n=>i.includes(n));if(r.length>0)return r}let t=await ho({message:Ye("select_features"),options:bt.map(o=>({value:o.value,label:o.label,hint:o.hint})),required:!0});return We(t)?null:t}async function ko(e){let t=await L();if(!e.yes){if(!await Vi(t))return null}let o=await Ji(e.language,t);if(!o)return null;let i=await Bi(e.editor);if(!i)return null;let r=await qi(e.type);if(!r)return null;let n;if(e.brief!==void 0)n=e.brief;else{let a=await zi();if(a===null)return null;n=a}let c=e.notify!==!1,s=e.doc||t?.docDir||".architext";return{language:o,editors:i,docDir:s,features:r,generateBrief:n,notify:c}}var mt=k(_(),"command.init");async function _o(e){l.clear(),Hi(ut.bgCyan(ut.black(` ${mt("title")} `)));let t=await ko(e);if(!t){Pt(ut.yellow(mt("cancel")));return}let o=await L();await ze({...o??{},...t});try{let i=await mo(t,{resolveConflicts:Ke.resolve.bind(Ke)}),r=await L();await ze({...t,...r??{},structureVersion:re,...i?.opencodeInstructionsAdded&&{opencodeInstructionsAdded:!0},...i?.opencodeNotifyAdded&&{opencodeNotifyAdded:!0},...i?.claudeNotifyAdded&&{claudeNotifyAdded:!0}})}catch(i){if(i instanceof ue){Pt(ut.yellow(mt("cancel")));return}throw i}Pt(mt("success"))}import{intro as Ki,outro as Rt,spinner as Wi}from"@clack/prompts";import Ee from"fs-extra";import Ne from"picocolors";import ea from"fs-extra";import H from"path";function yo(e,t){let o=z(),i=it(o,e.docDir),r=[],n=[],c=new Set;for(let a of i.frameworkFiles)r.push(H.resolve(t,a)),c.add(H.dirname(H.resolve(t,a)));for(let a of i.frameworkDirs){n.push(H.resolve(t,a));let p=H.dirname(H.resolve(t,a));c.add(p),c.add(H.dirname(p))}n.push(H.resolve(t,e.docDir)),r.push(H.resolve(t,"project-brief.md")),n.push(H.resolve(t,ot)),r.push(H.resolve(t,Ae));for(let a of i.frameworkFiles){let p=H.dirname(H.resolve(t,a));c.add(p),c.add(H.dirname(p))}let s=Array.from(c).filter(a=>a!==t).sort((a,p)=>p.split(H.sep).length-a.split(H.sep).length);return{files:r,dirs:n,dirsToCheck:s}}var Ce=k(_(),"command.uninstall"),wo=async()=>{l.clear(),Ki(Ne.bgRed(Ne.black(` ${Ce("title")} `)));let e=process.cwd(),t=await L(e);if(!t){Rt(Ne.yellow(Ce("not_found")));return}let o=yo(t,e);if(o.files.length+o.dirs.length===0){Rt(Ne.green(Ce("success")));return}let r=Wi();r.start(Ce("cleaning"));try{await lo(t.editors);for(let n of o.files)await Ee.pathExists(n)&&await Ee.remove(n);for(let n of o.dirs)await Ee.pathExists(n)&&await Ee.remove(n);for(let n of o.dirsToCheck){if(n===e||!await Ee.pathExists(n))continue;(await Ee.readdir(n)).length===0&&await Ee.remove(n)}r.stop(Ce("done")),Rt(Ne.green(Ce("success")))}catch(n){r.stop(Ne.red(Ce("error")));let c=n instanceof Error?n.message:String(n);throw new v(c)}};import{confirm as tr,intro as or,isCancel as ir,outro as Me,spinner as rr}from"@clack/prompts";import J from"picocolors";import ne from"fs-extra";import Le from"path";var Yi={"1->2":Qi};function Xi(e,t){return Yi[`${e}->${t}`]}function Zi(e,t){if(!Number.isInteger(e)||e<1)throw new Error(`Invalid currentVersion: ${e}, must be positive integer`);if(!Number.isInteger(t)||t<1)throw new Error(`Invalid targetVersion: ${t}, must be positive integer`);if(e>=t)return[];let o=[];for(let i=e;i<t;i++){let r=i+1,n=Xi(i,r);if(n)o.push({from:i,to:r,migrator:n});else throw new Error(`Migration chain broken: no migrator found for v${i} \u2192 v${r}. Please upgrade CLI to a newer version that supports this migration.`)}return o}async function xo(e,t,o=re){let i=e.structureVersion??1;if(i>=o)return{success:!0,fromVersion:i,toVersion:i,steps:[]};let r=Zi(i,o),n=[];for(let c of r)try{let s=await c.migrator(e,t);n.push({from:c.from,to:c.to,migrated:s.migrated})}catch(s){let a=s instanceof Error?s.message:String(s);return n.push({from:c.from,to:c.to,migrated:[],error:a}),{success:!1,fromVersion:i,toVersion:c.from,steps:n}}return{success:!0,fromVersion:i,toVersion:o,steps:n}}async function Qi(e,t){if(!St(1))return{migrated:[]};let i=[],r=Le.resolve(t,e.docDir),n=Le.join(r,"global","tech_stack.md");if(!await ne.pathExists(n))for(let a of e.editors){let p=D[a];if(!p)continue;let d=Le.resolve(t,`${p.targetDir}/02_tech_stack${p.targetExt}`);if(await ne.pathExists(d)){let C=(await ne.readFile(d,"utf-8")).replace(/^---[\s\S]*?---\n?/,"");await ne.ensureDir(Le.dirname(n)),await ne.writeFile(n,C,"utf-8"),i.push("tech_stack.md (migrated from 02_tech_stack)");break}}let c=["01_workflow","03_data_governance","04_cli_tools","99_context_glue"];for(let a of e.editors){let p=D[a];if(p)for(let d of c){let m=Le.resolve(t,`${p.targetDir}/${d}${p.targetExt}`);await ne.pathExists(m)&&(await ne.remove(m),i.push(`${d}${p.targetExt} (v1 rule removed)`))}}let s=Le.join(r,"global","map.json");if(await ne.pathExists(s)){let a=await ne.readFile(s,"utf-8"),p;try{p=JSON.parse(a)}catch{p={}}if("governance"in p||"featureDocs"in p){let{governance:d,featureDocs:m,...C}=p,R={directoryMapping:C.directoryMapping??[],logicalTopology:C.logicalTopology??[],criticalUserJourneys:C.criticalUserJourneys??[],featureRelations:C.featureRelations??[],...Object.fromEntries(Object.entries(C).filter(([M])=>!["directoryMapping","logicalTopology","criticalUserJourneys","featureRelations"].includes(M)))};await ne.writeFile(s,JSON.stringify(R,null,2)+`
|
|
29
|
+
`,"utf-8"),i.push("map.json (removed governance/featureDocs)")}}return{migrated:i}}import Pe from"fs-extra";import Xe from"path";var bo=[];var Tt=k(_(),"command.update");async function So(e,t){let o=Xe.join(t,e.docDir,"global","roadmap.json"),i=Xe.relative(t,o);if(!await Pe.pathExists(o))return{file:i,compatible:!0,migrated:!1};let r;try{r=await Pe.readJSON(o)}catch{return{file:i,compatible:!1,migrated:!1,errors:[Tt("schema.parse_error")]}}let n=typeof r.version=="number"?r.version:0;if(n>1)return{file:i,compatible:!1,migrated:!1,fromVersion:n,errors:[Tt("schema.version_too_new",{current:n,expected:1})]};if(n===1){let a=ae.safeParse(r);return a.success?{file:i,compatible:!0,migrated:!1}:{file:i,compatible:!1,migrated:!1,errors:a.error.issues.map(p=>`${p.path.join(".")}: ${p.message}`)}}let c=bo.filter(a=>a.fromVersion>=n&&a.fromVersion<1).sort((a,p)=>a.fromVersion-p.fromVersion),s=r;for(let a of c)s=a.migrate(s);return s.version=1,await Pe.writeJSON(o,s,{spaces:2}),{file:i,compatible:!0,migrated:!0,fromVersion:n,toVersion:1}}async function vo(e,t){let o=Xe.join(t,e.docDir,"tasks"),i=[];if(!await Pe.pathExists(o))return i;let r;try{r=await Pe.readdir(o)}catch{return i}for(let n of r){let c=Xe.join(o,n,"plan.json"),s=Xe.relative(t,c);if(!await Pe.pathExists(c))continue;let a;try{a=await Pe.readJSON(c)}catch{i.push({file:s,compatible:!1,errors:[Tt("schema.parse_error")]});continue}let p=Se.safeParse(a);p.success?i.push({file:s,compatible:!0}):i.push({file:s,compatible:!1,errors:p.error.issues.map(d=>`${d.path.join(".")}: ${d.message}`)})}return i}import Z from"fs-extra";import I from"path";function Do(e,t){let o=new Set;for(let i of e){let r=D[i];if(r)for(let n of Object.keys(t))o.add(`${r.targetDir}/${n}${r.targetExt}`.replace(/\\/g,"/"))}return o}async function Eo(e,t){let o=z(),i=it(o,e.docDir),r=Oe(o,e),n=new Set([...r.frameworkFiles,...r.frameworkDirs]),c=Do(Object.keys(D),o.rulePolicy),s=0;for(let d of i.frameworkFiles){if(n.has(d)||c.has(d))continue;let m=I.resolve(t,d);await Z.pathExists(m)&&(await Z.remove(m),s++)}for(let d of i.frameworkDirs){if(n.has(d))continue;let m=I.resolve(t,d);await Z.pathExists(m)&&(await Z.remove(m),s++)}let a=new Set;for(let d of i.frameworkFiles)a.add(I.dirname(I.resolve(t,d)));for(let d of i.frameworkDirs){let m=I.dirname(I.resolve(t,d));a.add(m),a.add(I.dirname(m))}let p=Array.from(a).filter(d=>d!==t).sort((d,m)=>m.split(I.sep).length-d.split(I.sep).length);for(let d of p){if(!await Z.pathExists(d))continue;(await Z.readdir(d)).length===0&&await Z.remove(d)}return s}async function Co(e,t){let o=z(),i=Do(e.editors,o.rulePolicy),r=await Ct({language:e.language,editors:e.editors,docDir:e.docDir,features:e.features??[],generateBrief:!1}),n=r.frameworkOps.filter(d=>{let m=I.relative(t,d.dest).replace(/\\/g,"/");return!i.has(m)});for(let d of["docs","ide"]){let m=n.filter(C=>C.group===d);m.length>0&&await B.execute(m)}let c=n.filter(d=>!d.group);c.length>0&&await B.execute(c);let s=0,a=[];for(let d of r.seedOps)await Z.pathExists(d.dest)||(a.push(d),s++);a.length>0&&await B.execute(a);let p=I.resolve(t,e.docDir);return await Z.ensureDir(I.join(p,"scripts")),await Z.ensureDir(I.join(p,"tasks")),await Z.ensureDir(I.join(p,"refs")),{frameworkCount:n.length,seedCount:s}}async function Po(e){let t=z(),o=Object.entries(t.rulePolicy).filter(([,x])=>x==="templateOnly").map(([x])=>x);if(o.length===0)return[];let i=await B.getRoot(),r=await Z.pathExists(I.join(i,e.language))?e.language:"zh",n=I.join(i,r),c=I.join(n,G.PATHS.RULES_SOURCE),s=I.join(n,G.PATHS.DOCS_SOURCE),a=e.features&&e.features.length>0?e.features.join(", "):"\u672A\u6307\u5B9A",p={[G.PLACEHOLDERS.DOCS_DIR]:e.docDir,[G.PLACEHOLDERS.PROJECT_TYPE]:a},d=e.editors.some(x=>!!D[x]?.skills),m=e.editors.some(x=>!!D[x]?.subagents),C=e.editors.some(x=>!!D[x]?.commands),R=x=>Je(x,{hasSkills:d,hasSubagents:m,hasCommands:C},s),M=[];for(let x of o){let T=I.join(c,`${x}.md`);if(!await Z.pathExists(T))continue;let W=I.join(process.cwd(),e.docDir,"templates",`${x}.template.md`);await Z.ensureDir(I.dirname(W)),await B.processFile(T,W,p,R),M.push(x)}return M}async function Ro(){try{let e=await fetch("https://registry.npmjs.org/architext/latest",{signal:AbortSignal.timeout(5e3)});if(!e.ok)return null;let o=(await e.json()).version,i=pe.version;return{current:i,latest:o,isOutdated:er(o,i)>0}}catch{return null}}function er(e,t){let o=e.split(".").map(Number),i=t.split(".").map(Number);for(let r=0;r<3;r++){let n=(o[r]??0)-(i[r]??0);if(n!==0)return n}return 0}var h=k(_(),"command.update");async function To(){l.clear(),or(J.bgCyan(J.black(` ${h("title")} `)));let e=process.cwd(),t=await L(e);if(!t){Me(J.yellow(h("no_config")));return}let o=rr();o.start(h("version_checking"));let i=await Ro();if(i?i.isOutdated?(o.stop(J.yellow(h("version_outdated",{current:i.current,latest:i.latest}))),l.info(h("version_upgrade_hint",{cmd:`npm install -g architext@${i.latest}`}))):o.stop(J.green(h("version_up_to_date",{version:i.current}))):o.stop(J.dim(h("version_check_skip"))),t.structureVersion==null){l.dim(""),l.warn(h("legacy_migration_blocked")),l.dim(h("legacy_migration_step1")),l.dim(h("legacy_migration_step2")),l.dim(h("legacy_migration_step3")),l.dim(h("legacy_migration_step4")),Me(J.yellow(h("cancel")));return}if(t.structureVersion>re){l.dim(""),l.warn(h("version_too_new",{project:t.structureVersion,cli:re})),Me(J.yellow(h("cancel")));return}let r=z(),n=Object.entries(r.rulePolicy).filter(([,b])=>b==="neverTouch").map(([b])=>b),c=Object.entries(r.rulePolicy).filter(([,b])=>b==="templateOnly").map(([b])=>b);l.warn(h("update_warning")),l.dim(h("update_skip_hint",{list:[...n,...c].join(", ")})),l.dim(h("update_global_hint"));let s=await tr({message:h("update_confirm")});if(ir(s)||!s){Me(J.yellow(h("cancel")));return}let a=t.structureVersion;if(t.structureVersion<re){let b;try{b=await xo(t,e,re)}catch(F){let ce=F instanceof Error?F.message:String(F);l.error(h("migration_chain_broken",{error:ce})),Me(J.red(h("failed")));return}a=b.toVersion;let te=0,ee=!1;for(let F of b.steps){if(o.start(h("migrating_structure",{fromVersion:F.from,toVersion:F.to})),F.error){o.stop(J.yellow(h("migration_warn"))),l.dim(F.error),ee=!0;break}F.migrated.length>0?(o.stop(J.green(h("migrated_structure",{fromVersion:F.from,toVersion:F.to,count:F.migrated.length}))),F.migrated.forEach(ce=>l.dim(` \u2713 ${ce}`)),te+=F.migrated.length):o.stop(J.dim(h("migration_nothing")))}ee&&l.warn(h("migration_partial",{done:te}))}o.start(h("removing_old"));let p=0;try{p=await Eo(t,e)}catch(b){throw o.stop(J.red(h("failed"))),new v(b instanceof Error?b.message:String(b))}o.stop(J.green(h("removed_old",{count:p}))),o.start(h("deploying_new"));let d=0,m=0;try{({frameworkCount:d,seedCount:m}=await Co(t,e))}catch(b){throw o.stop(J.red(h("failed"))),new v(b instanceof Error?b.message:String(b))}o.stop(J.green(h("deployed_new",{framework:d,seeds:m})));let C=t.notify!==!1,{opencodeNotifyAdded:R,claudeNotifyAdded:M}=await dt(t.editors,C);(R||M)&&l.success(h("notify_enabled"));let x=await Po(t);l.dim(""),l.step(h("schema_auditing"));let T=await So(t,e),W=await vo(t,e);if(T.compatible?T.migrated?l.success(h("schema.roadmap_migrated",{file:T.file,from:T.fromVersion??0,to:T.toVersion??1})):l.success(h("schema.roadmap_ok",{file:T.file})):(l.fail(h("schema.roadmap_error",{file:T.file})),T.errors?.forEach(b=>l.dim(` ${b}`))),W.length===0)l.dim(h("schema.no_plans"));else{let b=W.filter(te=>!te.compatible);b.length===0?l.success(h("schema.plans_ok",{count:W.length})):b.forEach(te=>{l.fail(h("schema.plan_error",{file:te.file})),te.errors?.forEach(ee=>l.dim(` ${ee}`))})}l.dim(""),l.step(h("summary")),l.done(h("summary_framework",{count:d})),m>0&&l.info(h("summary_seeds",{count:m})),x.length>0&&l.info(h("summary_templated",{docDir:t.docDir})),n.length>0&&l.dim(h("summary_skipped",{list:n.join(", ")})),l.dim(h("summary_global")),await ze({...t,structureVersion:a},e),Me(J.green(h("success")))}import cr from"fs-extra";import Ze from"picocolors";function jo(e,t,o){let i=k(_(),"command.plan");if(l.info(""),l.info(Ze.bold(`\u{1F4CB} ${i("title",{id:e,name:t})}`)),l.info(""),o.sections.length===0){l.warn(i("empty"));return}let r=0,n=0;for(let s of o.sections){let a=s.done===s.total;if(s.isManual)l.dim(`${s.name.padEnd(36)} ${i("section_manual",{done:s.done,total:s.total})}`);else{r+=s.total,n+=s.done;let p=a?Ze.green("\u2705"):Ze.yellow("\u26A0\uFE0F"),d=i("section_pass",{done:s.done,total:s.total});if(l.info(`${s.name.padEnd(36)} ${a?Ze.green(d):Ze.yellow(d)} ${p}`),!a)for(let m of s.items)m.done||l.error(` - ${m.id}: ${m.title}`)}}l.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500");let c=r>0?Math.round(n/r*100):0;l.info(i("total",{done:n,total:r,percent:c})),n===r&&r>0?l.success(i("all_done")):r>0&&l.warn(i("remaining",{count:r-n})),l.info("")}var nr=["manual verification","manual check","manual","\u4EBA\u5DE5\u9A8C\u6536","\u624B\u52A8\u9A8C\u8BC1","\u624B\u52D5\u9A57\u8B49","\u4EBA\u5DE5\u9A57\u6536"];function Oo(e){let t=[];for(let o of e.phases){let i=nr.some(r=>o.name.toLowerCase().includes(r));t.push({name:o.name,isManual:i,items:o.tasks,done:o.tasks.filter(r=>r.done).length,total:o.tasks.length})}return e.tests&&(e.tests.automated&&e.tests.automated.length>0&&t.push({name:"Automated Tests",isManual:!1,items:e.tests.automated,done:e.tests.automated.filter(o=>o.done).length,total:e.tests.automated.length}),e.tests.manual&&e.tests.manual.length>0&&t.push({name:"Manual Verification",isManual:!0,items:e.tests.manual,done:e.tests.manual.filter(o=>o.done).length,total:e.tests.manual.length})),{sections:t}}import jt from"fs-extra";import $o from"path";import Ao from"fs-extra";import Io from"path";var sr=[".architext"];async function he(e=process.cwd()){let t=await L(e);if(t?.docDir){let o=Io.resolve(e,t.docDir);if(await Ao.pathExists(o))return o}for(let o of sr){let i=Io.resolve(e,o);if(await Ao.pathExists(i))return i}return null}var ar="plan.json";async function Fo(e,t=process.cwd()){let o=await he(t);if(!o)throw new be(e);let i=$o.join(o,"tasks");if(!await jt.pathExists(i))throw new be(e);let n=(await jt.readdir(i)).find(a=>a.startsWith(`${e}_`));if(!n)throw new be(e);let c=$o.join(i,n,ar);if(!await jt.pathExists(c))throw new be(e);let s=n.replace(`${e}_`,"").replace(/_/g," ");return{filePath:c,featureName:s}}async function No(e){if(!e){let c=k(_(),"plan");throw new v(c("id_required"),"PLAN_ID_REQUIRED",!0)}let{filePath:t,featureName:o}=await Fo(e),i=await cr.readJSON(t),r=ve(Se,i,`${e}/plan.json`),n=Oo(r);jo(e,o,n)}import ke from"fs-extra";import Qe from"path";var lr={pending:" ",active:" ",done:"x",blocked:" "},pr={pending:"\u23F3",active:"\u{1F7E2}",done:"\u2705",blocked:"\u{1F9F1}"},dr={pending:"pending",active:"active",done:"done",blocked:"blocked"};function Ot(e){return e.replace(/"/g,"#quot;")}function ur(e){return e.replace(/([;;.。])\s*/g,"$1<br/>").trimEnd().replace(/<br\/>$/,"")}function mr(e){let t=Ot(e.id),o=Ot(e.title);if(e.goal){let i=ur(Ot(e.goal));return`"<b>[${t}] ${o}</b><br/>${i}"`}return`"<b>[${t}] ${o}</b>"`}function Lo(e,t="zh"){let o=k(t,"command.render"),r=[o("roadmap.header_comment")+`
|
|
16
30
|
`+o("roadmap.header_ai")+`
|
|
17
31
|
|
|
18
32
|
`];r.push(`# ${o("roadmap.title")}
|
|
19
33
|
`),r.push(`> **${o("roadmap.status")}**: ${e.projectStatus} | **${o("roadmap.updated")}**: ${e.lastUpdated}
|
|
20
34
|
`),r.push(`<!-- TASKS_START -->
|
|
21
|
-
`);for(let
|
|
22
|
-
`);for(let a of
|
|
35
|
+
`);for(let s of e.phases){r.push(`## ${o("roadmap.phase")}: ${s.name}
|
|
36
|
+
`);for(let a of s.tasks)r.push(fr(a)),a.goal&&r.push(` - \u{1F3AF} ${o("roadmap.goal")}: ${a.goal}`),a.deps&&a.deps.length>0?r.push(` - \u{1F517} ${o("roadmap.dep")}: ${a.deps.map(p=>`[${p}]`).join(", ")}`):r.push(` - \u{1F517} ${o("roadmap.dep")}: ${o("roadmap.dep_none")}`),a.tag&&r.push(` - \u{1F3F7}\uFE0F ${o("roadmap.tag")}: ${a.tag}`),a.slug&&r.push(` - \u{1F4C1} ${o("roadmap.slug")}: ${a.slug}`);r.push("")}r.push(`<!-- TASKS_END -->
|
|
23
37
|
`),r.push(`<!-- VISUAL_START -->
|
|
24
|
-
`),r.push("```mermaid"),r.push("graph LR"),r.push(""),r.push(" classDef done fill:#4ade80,stroke:#16a34a,color:#000;"),r.push(" classDef active fill:#60a5fa,stroke:#2563eb,color:#000;"),r.push(" classDef pending fill:#e2e8f0,stroke:#94a3b8,color:#000;"),r.push(" classDef blocked fill:#fca5a5,stroke:#dc2626,color:#000;"),r.push("");let
|
|
25
|
-
`)}function
|
|
38
|
+
`),r.push("```mermaid"),r.push("graph LR"),r.push(""),r.push(" classDef done fill:#4ade80,stroke:#16a34a,color:#000;"),r.push(" classDef active fill:#60a5fa,stroke:#2563eb,color:#000;"),r.push(" classDef pending fill:#e2e8f0,stroke:#94a3b8,color:#000;"),r.push(" classDef blocked fill:#fca5a5,stroke:#dc2626,color:#000;"),r.push("");let n=e.phases.flatMap(s=>s.tasks);for(let s of n)r.push(` ${s.id}[${mr(s)}]`);r.push("");let c=hr(n);for(let s of n)if(s.deps)for(let a of s.deps)c.has(`${a}-->${s.id}`)||r.push(` ${a} --> ${s.id}`);r.push("");for(let s of n)r.push(` class ${s.id} ${dr[s.status]};`);return r.push("```\n"),r.push("<!-- VISUAL_END -->"),r.join(`
|
|
39
|
+
`)}function fr(e){let t=lr[e.status],o=pr[e.status];return`- [${t}] ${o} **[${e.id}]** ${e.title}`}function gr(e,t,o){let i=new Set,r=[e];for(;r.length>0;){let n=r.shift();if(n===t)return!0;if(!i.has(n)){i.add(n);for(let c of o.get(n)??[])r.push(c)}}return!1}function hr(e){let t=new Map;for(let i of e)for(let r of i.deps??[])t.has(r)||t.set(r,new Set),t.get(r).add(i.id);let o=new Set;for(let i of e)for(let r of i.deps??[])for(let n of t.get(r)??[])if(n!==i.id&&gr(n,i.id,t)){o.add(`${r}-->${i.id}`);break}return o}function Mo(e,t="zh"){let o=k(t,"command.render"),r=[o("plan.header_comment")+`
|
|
26
40
|
`+o("plan.header_ai")+`
|
|
27
41
|
|
|
28
42
|
`];if(r.push(`# ${o("plan.title",{featureName:e.featureName})}
|
|
29
43
|
`),r.push(`> **${o("plan.feature_id")}**: ${e.featureId} | **${o("plan.status")}**: ${e.status}
|
|
30
44
|
`),e.decisions&&e.decisions.length>0){r.push(`## 1. ${o("plan.section_decisions")}
|
|
31
|
-
`);for(let
|
|
32
|
-
`);for(let
|
|
45
|
+
`);for(let n of e.decisions)r.push(`- **${n.category}**: ${n.choice}`),n.rationale&&r.push(` - \u{1F4DD} ${n.rationale}`);r.push("")}r.push(`## 2. ${o("plan.section_steps")}
|
|
46
|
+
`);for(let n of e.phases){let s=n.tasks.every(a=>a.done)?"x":" ";r.push(`* [${s}] **${n.name}**`);for(let a of n.tasks){let p=a.done?"x":" ";r.push(` - [${p}] ${a.title}`),a.notes&&r.push(` - \u{1F4DD} ${a.notes}`)}r.push("")}if(e.tests){if(r.push(`## 3. ${o("plan.section_tests")}
|
|
33
47
|
`),e.tests.automated&&e.tests.automated.length>0){r.push(`### ${o("plan.subsection_automated")}
|
|
34
|
-
`);for(let
|
|
35
|
-
`);for(let
|
|
36
|
-
`)}var
|
|
37
|
-
\u{1F4CA} ${t("list.title")}`)),l.info(
|
|
38
|
-
`)}function
|
|
39
|
-
${
|
|
40
|
-
`}function
|
|
41
|
-
`),t=[
|
|
42
|
-
`),o=[
|
|
43
|
-
`),i=[
|
|
44
|
-
`),r=[
|
|
48
|
+
`);for(let n of e.tests.automated){let c=n.done?"x":" ";r.push(`* [${c}] ${n.title}`),n.notes&&r.push(` - \u{1F4DD} ${n.notes}`)}r.push("")}if(e.tests.manual&&e.tests.manual.length>0){r.push(`### ${o("plan.subsection_manual")}
|
|
49
|
+
`);for(let n of e.tests.manual){let c=n.done?"x":" ";r.push(`* [${c}] ${n.title}`),n.notes&&r.push(` - \u{1F4DD} ${n.notes}`)}r.push("")}}return r.join(`
|
|
50
|
+
`)}var Uo=k(_(),"command.render");async function kr(){return(await L())?.language??_()}async function Go(){let e=await he();if(!e)throw new v("Documentation directory not found. Run 'archi init' first.","DOC_DIR_NOT_FOUND",!0);let t=0,o=await kr(),i=Qe.join(e,"global","roadmap.json");if(await ke.pathExists(i)){let n=await ke.readJSON(i),c=ve(ae,n,"roadmap.json"),s=Lo(c,o),a=Qe.join(e,"global","roadmap.md");await ke.writeFile(a,s,"utf-8"),l.step("roadmap.json \u2192 roadmap.md"),t++}let r=Qe.join(e,"tasks");if(await ke.pathExists(r)){let n=await ke.readdir(r);for(let c of n){let s=Qe.join(r,c,"plan.json");if(await ke.pathExists(s)){let a=await ke.readJSON(s),p=ve(Se,a,`${c}/plan.json`),d=Mo(p,o),m=Qe.join(r,c,"plan.md");await ke.writeFile(m,d,"utf-8"),l.step(`${c}/plan.json \u2192 plan.md`),t++}}}t===0?l.warn(Uo("empty")):l.success(Uo("done",{count:t}))}import _r from"fs-extra";var ft=class{async parse(t){let o=await _r.readJSON(t);return ve(ae,o,"roadmap.json")}};import br from"fs-extra";import Ho from"picocolors";function Vo(e){return e.phases.flatMap(t=>t.tasks)}function At(e){let t=new Map;for(let o of e.phases)for(let i of o.tasks)t.set(i.id,i);return t}import gt from"picocolors";var It=["pending","active","done","blocked"],Jo={pending:"\u23F3",active:"\u{1F7E2}",done:"\u2705",blocked:"\u{1F9F1}"},Bo={pending:gt.white,active:gt.green,done:gt.blue,blocked:gt.red};import yr from"picocolors";function wr(e){return Jo[e]??"\u23F3"}function xr(e){return Bo[e]??yr.dim}function zo(e,t,o=30){let i=t>0?Math.round(e/t*100):0,r=Math.round(i/100*o);return`Progress: [${"\u2588".repeat(r)+"\u2591".repeat(o-r)}] ${i}% (${e}/${t})`}function qo(e){let t=wr(e.status);return xr(e.status)(`${t} [${e.id}] ${e.title}`)}async function Ko(e){let t=k(_(),"command.task"),o=[],i=At(e),r=new Set;for(let n of e.phases)for(let c of n.tasks)r.has(c.id)&&o.push(`Duplicate task ID: [${c.id}]`),r.add(c.id);for(let[n,c]of i)if(c.deps)for(let s of c.deps)s&&!i.has(s)&&o.push(t("check.invalid_dep",{id:n,depId:s}));for(let[n,c]of i)It.includes(c.status)||o.push(`Task [${n}] has invalid status: "${c.status}"`);if(o.length>0)throw o.forEach(n=>l.error(n)),new at(o);l.success(t("check.consistent"))}async function Wo(e,t,o,i){let r=k(_(),"command.task");if(!o)throw new v(r("update.id_required"),"MISSING_TASK_ID",!0);if(!It.includes(i))throw new st(i);let n=i,c=!1;for(let s of e.phases){for(let a of s.tasks)if(a.id===o){l.step(r("update.updating",{id:o,status:n})),a.status=n,c=!0;break}if(c)break}if(!c)throw new nt(o);if(n==="done"){let s=Sr(e,o);for(let a of s)l.done(r("update.unblocked",{id:a}))}e.lastUpdated=new Date().toISOString().split("T")[0],await br.writeJSON(t,e,{spaces:2}),l.done(r("update.done",{id:o,status:n}))}function Sr(e,t){let o=At(e),i=[];for(let r of e.phases)for(let n of r.tasks){if(n.status!=="blocked"||!n.deps?.includes(t))continue;n.deps.every(s=>{let a=o.get(s);return a&&a.status==="done"})&&(n.status="pending",i.push(n.id))}return i}function Yo(e){let t=k(_(),"command.task"),o=Vo(e);if(o.length===0){l.warn(t("list.empty"));return}let i={pending:0,active:0,done:0,blocked:0};o.forEach(r=>i[r.status]++),l.info(Ho.bold(`
|
|
51
|
+
\u{1F4CA} ${t("list.title")}`)),l.info(zo(i.done,o.length)),l.info("");for(let r of e.phases)if(r.tasks.length>0){l.info(Ho.dim(`\u2500\u2500 ${r.name} \u2500\u2500`));for(let n of r.tasks)l.info(qo(n));l.info("")}}import ht from"fs-extra";import kt from"path";var vr=["global/roadmap.json","roadmap.json"];async function Xo(e=process.cwd()){let t=await L(e);if(t?.roadmap){let i=kt.resolve(e,t.roadmap);if(await ht.pathExists(i))return i}if(t?.docDir){let i=kt.join(e,t.docDir,"global/roadmap.json");if(await ht.pathExists(i))return i}let o=await he(e);if(o){let i=kt.join(o,"global/roadmap.json");if(await ht.pathExists(i))return i}for(let i of vr){let r=kt.join(e,i);if(await ht.pathExists(r))return r}throw new rt}async function Zo(e,t){let o=await Xo(),r=await new ft().parse(o);if(t.check){await Ko(r);return}if(t.status){await Wo(r,o,e,t.status);return}Yo(r)}import w from"picocolors";var u=k(_(),"command.help");function j(e,t,o){let i=[` ${w.cyan(e)}`,` ${t}`];if(o)for(let r of o)i.push(` ${w.dim(r)}`);return i.push(""),i.join(`
|
|
52
|
+
`)}function _t(e){return`
|
|
53
|
+
${w.bold(w.underline(e))}
|
|
54
|
+
`}function Ue(e,t){return` ${e.padEnd(22)} ${w.dim("-->")} ${w.cyan(t)}`}async function Qo(){let e=["",` ${w.bold("Architext")} ${w.dim(`v${pe.version}`)}`,` ${w.dim(u("tagline"))}`,` ${w.dim("\u2500".repeat(50))}`].join(`
|
|
55
|
+
`),t=[_t(u("section.ai")),` ${w.dim(u("ai.chatModeHint"))}`,"",j("/archi.start [file_path]",u("ai.start.desc"),[u("ai.start.detail"),u("ai.start.example")]),j("/archi.inherit",u("ai.inherit.desc"),[u("ai.inherit.detail")]),j("/archi.scope [file_path]",u("ai.scope.desc"),[u("ai.scope.detail"),u("ai.scope.example")]),j("/archi.plan <ID> [context]",u("ai.plan.desc"),[u("ai.plan.detail"),u("ai.plan.example1"),u("ai.plan.example2")]),j("/archi.code <id>",u("ai.code.desc"),[u("ai.code.detail"),u("ai.code.example")]),j("/archi.audit [id]",u("ai.audit.desc"),[u("ai.audit.detail"),u("ai.audit.example1"),u("ai.audit.example2")]),j("/archi.fix [id] <context>",u("ai.fix.desc"),[u("ai.fix.detail"),u("ai.fix.example")]),j("/archi.edit <id> [context]",u("ai.edit.desc"),[u("ai.edit.detail"),u("ai.edit.example")]),j("/archi.revise [context]",u("ai.revise.desc"),[u("ai.revise.detail"),u("ai.revise.example")]),j("/archi.ui",u("ai.ui.desc"),[u("ai.ui.detail")]),j("/archi.map",u("ai.map.desc"),[u("ai.map.detail")]),j("/archi.remove <id>",u("ai.remove.desc"),[u("ai.remove.detail"),u("ai.remove.example")]),j("/archi.help [question]",u("ai.help.desc"),[u("ai.help.detail"),u("ai.help.example1"),u("ai.help.example2")])].join(`
|
|
56
|
+
`),o=[_t(u("section.cli")),j("npx archi init [-e editor] [-l lang] [-d path] [--no-notify]",u("cli.init.desc"),[`-e, --editor <type> ${u("cli.init.editor")}`,`-l, --language <lang> ${u("cli.init.lang")}`,`-d, --doc <path> ${u("cli.init.doc")}`,` --no-notify ${u("cli.init.noNotify")}`]),j("npx archi update",u("cli.update.desc")),j("npx archi doctor",u("cli.doctor.desc")),j("npx archi task [id] [--status <s>] [--check]",u("cli.task.desc"),[u("cli.task.detail"),u("cli.task.example")]),j("npx archi plan <id>",u("cli.plan.desc"),[u("cli.plan.example")]),j("npx archi render",u("cli.render.desc")),j("npx archi pack [-o file]",u("cli.pack.desc"),[u("cli.pack.example")]),j("npx archi template <name>",u("cli.template.desc"),[u("cli.template.example")]),j("npx archi uninstall",u("cli.uninstall.desc"))].join(`
|
|
57
|
+
`),i=[_t(u("section.quick")),Ue(u("quick.new_project"),"/archi.start [desc]"),Ue(u("quick.legacy"),"/archi.inherit"),Ue(u("quick.new_feature"),"/archi.scope [file_path]"),Ue(u("quick.write_code"),"/archi.code <id>"),Ue(u("quick.fix_bug"),"/archi.fix [id] <desc>"),Ue(u("quick.check_health"),"/archi.audit"),""].join(`
|
|
58
|
+
`),r=[_t(u("section.workflow")),` ${w.dim(u("workflow.init_flow"))}`,` ${w.cyan("/archi.start")} ${w.dim("-->")} ${w.cyan("/archi.ui")} ${w.dim("[?UI] -->")} ${w.cyan("/archi.plan")} ${w.dim("-->")} ${w.cyan("/archi.code")}`,"",` ${w.dim(u("workflow.new_feature"))}`,` ${w.cyan("/archi.scope")} ${w.dim("-->")} ${w.cyan("/archi.ui")} ${w.dim("[?UI] -->")} ${w.cyan("/archi.plan")} ${w.dim("-->")} ${w.cyan("/archi.code")}`,"",` ${w.dim(u("workflow.change_spec"))}`,` ${w.cyan("/archi.edit")} ${w.dim("-->")} ${w.cyan("/archi.code")}`,"",` ${w.dim(u("workflow.standalone"))}`,` ${w.cyan("/archi.fix")} ${w.cyan("/archi.revise")} ${w.cyan("/archi.audit")} ${w.cyan("/archi.remove")}`,""].join(`
|
|
45
59
|
`);l.raw([e,t,o,i,r].join(`
|
|
46
|
-
`))}import
|
|
60
|
+
`))}import et from"fs-extra";import $t from"path";var Ge=k(_(),"command.template");async function Dr(){return(await L())?.language??_()}async function ei(e){if(!e){let s=Object.keys(tt);l.info(Ge("usage")),l.info("");for(let a of s)l.info(` ${a}`);l.info("");return}let t=tt[e];if(!t){let s=Object.keys(tt).join(", ");throw new v(Ge("unknown",{name:e,available:s}),"UNKNOWN_TEMPLATE",!0)}let o=$t.join(process.cwd(),t.output);if(await et.pathExists(o)){l.warn(Ge("exists",{path:t.output}));return}let i=await he();if(i){let s=$t.join(i,"templates",t.file);if(await et.pathExists(s)){await et.copy(s,o),l.success(Ge("done",{path:t.output}));return}}let r=await Dr(),n=await B.getRoot(),c=$t.join(n,r,"docs","templates",t.file);if(await et.pathExists(c)){await et.copy(c,o),l.success(Ge("done",{path:t.output}));return}throw new v(Ge("not_found",{name:t.file}),"TEMPLATE_NOT_FOUND",!0)}import{intro as Cr,outro as Nt,spinner as Pr}from"@clack/prompts";import Te from"picocolors";import Rr from"fs-extra";import Tr from"path";import Ve from"fs-extra";import Re from"path";function Ft(e){return e.replace(/\\/g,"/")}function Er(){let e=z();return Object.entries(e.rulePolicy).filter(([,t])=>t==="neverTouch"||t==="templateOnly").map(([t])=>t)}async function ti(e,t,o=[]){let i=t??e,r=[];if(!await Ve.pathExists(e))return r;let n=await Ve.readdir(e,{withFileTypes:!0});for(let c of n){let s=Re.join(e,c.name);if(c.isDirectory()){if(o.includes(c.name))continue;r.push(...await ti(s,i,o))}else c.isFile()&&r.push({fullPath:s,relPath:Ft(Re.relative(i,s))})}return r}async function oi(e,t){let o=Re.resolve(t,e.docDir),i=[],r=["global","tasks","scripts","refs"];for(let c of r){let s=Re.join(o,c);if(!await Ve.pathExists(s))continue;let a=c==="global"?["references"]:[];for(let{fullPath:p,relPath:d}of await ti(s,void 0,a)){let m=await Ve.readFile(p,"utf-8");i.push({path:Ft(Re.join(e.docDir,c,d)),content:m})}}let n=[...Er(),"02_tech_stack"];for(let c of e.editors){let s=D[c];if(s)for(let a of n){let p=Re.resolve(t,s.targetDir,`${a}${s.targetExt}`);if(!await Ve.pathExists(p))continue;let d=await Ve.readFile(p,"utf-8");i.push({path:Ft(Re.join(s.targetDir,`${a}${s.targetExt}`)),content:d})}}return i}function ii(e,t,o){let i=new Date().toISOString().split("T")[0],r=e.map(({path:n,content:c})=>{let s=c.replace(/]]>/g,"]]]]><![CDATA[>");return[` <file path="${n}">`,"<![CDATA[",s,"]]>"," </file>"].join(`
|
|
47
61
|
`)}).join(`
|
|
48
62
|
|
|
49
63
|
`);return['<?xml version="1.0" encoding="UTF-8"?>',"<!--"," Architext User Data Pack",` CLI Version : ${o}`,` DocDir : ${t.docDir}`,` Editors : ${t.editors.join(", ")}`,` Created : ${i}`,` Files : ${e.length}`,""," Restore with:"," archi recover architext-pack.xml","-->",`<architext-pack version="${o}" doc-dir="${t.docDir}" created="${i}">`,""," <files>","",r,""," </files>","","</architext-pack>"].join(`
|
|
50
|
-
`)}var
|
|
64
|
+
`)}var _e=k(_(),"command.pack");async function ri(e={}){Cr(Te.bgCyan(Te.black(` ${_e("title")} `)));let t=process.cwd(),o=await L(t);if(!o){Nt(Te.yellow(_e("no_config")));return}let i=e.output??"architext-pack.xml",r=Tr.resolve(t,i),n=Pr();n.start(_e("packing"));let c=await oi(o,t);if(c.length===0){n.stop(Te.yellow(_e("empty"))),Nt(Te.yellow(_e("empty_hint")));return}let s=ii(c,o,pe.version);await Rr.writeFile(r,s,"utf-8"),n.stop(Te.green(_e("done",{count:String(c.length),file:i}))),l.info(_e("hint_recover",{file:i})),Nt(Te.green(_e("success")))}import jr from"node-notifier";import Or from"fs-extra";import{fileURLToPath as Ar}from"url";import{dirname as Ir,resolve as Lt}from"path";var ni=k(_(),"notify"),$r=async()=>{let e=Ar(import.meta.url),t=Ir(e),o=[Lt(t,"templates/icon.svg"),Lt(t,"../templates/icon.svg"),Lt(process.cwd(),"node_modules/architext/templates/icon.svg")];for(let i of o)if(await Or.pathExists(i))return i;return""},si=async e=>{let t=e||ni("defaultMessage"),o=await $r();jr.notify({title:ni("title"),message:t,icon:o||void 0,wait:!1,sound:!0})};var yt=k(_(),"common.error"),Mt=e=>{e instanceof ue&&(l.warn(yt("cancel",{msg:e.message})),process.exit(0)),e instanceof v&&(e.isUserError?l.error(yt("internal",{code:e.code,msg:e.message})):l.error(e.stack||e.message),process.exit(1)),e instanceof Error&&(l.error(yt("unexpected",{msg:e.message})),l.error(e.stack||e.message),process.exit(1)),l.error(yt("unknown")),process.exit(1)};var Q=Fr("architext"),Nr=_(),$=k(Nr),se=e=>async(...t)=>{try{await e(...t)}catch(o){Mt(o)}};Q.command("init",$("init.desc")).option("-e, --editor <type>",$("init.editor")).option("-l, --language <lang>",$("init.lang")).option("-d, --doc <path>",$("init.doc")).option("-t, --type <type>",$("init.type")).option("-y, --yes",$("init.yes")).option("-b, --brief",$("init.brief")).option("--no-notify",$("init.noNotify")).action(se(_o));Q.command("update",$("update.desc")).action(se(To));Q.command("doctor",$("doctor.desc")).action(async()=>{try{await no()}catch(e){Mt(e)}});Q.command("uninstall",$("uninstall.desc")).alias("remove").alias("rm").action(se(wo));Q.command("task [id]",$("task.desc")).option("--status <status>",$("task.status")).option("--check",$("task.check")).action(se(Zo));Q.command("plan <id>",$("plan.desc")).action(se(No));Q.command("render",$("render.desc")).action(se(Go));Q.command("template [name]",$("template.desc")).action(se(ei));Q.command("pack",$("pack.desc")).option("-o, --output <file>",$("pack.output")).action(se(ri));Q.command("help",$("help.desc")).action(se(Qo));Q.command("notify [message]",$("notify.desc")).action(se(si));Q.help();Q.version(pe.version);Q.parse();
|