claude-code-workflow 6.3.4 → 6.3.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.
Files changed (111) hide show
  1. package/.claude/agents/issue-plan-agent.md +859 -0
  2. package/.claude/agents/issue-queue-agent.md +702 -0
  3. package/.claude/commands/issue/execute.md +453 -0
  4. package/.claude/commands/issue/manage.md +865 -0
  5. package/.claude/commands/issue/new.md +484 -0
  6. package/.claude/commands/issue/plan.md +421 -0
  7. package/.claude/commands/issue/queue.md +354 -0
  8. package/.claude/commands/{clean.md → workflow/clean.md} +5 -5
  9. package/.claude/commands/workflow/docs/analyze.md +1467 -0
  10. package/.claude/commands/workflow/docs/copyright.md +1265 -0
  11. package/.claude/commands/workflow/execute.md +0 -1
  12. package/.claude/commands/workflow/tools/conflict-resolution.md +76 -240
  13. package/.claude/commands/workflow/tools/context-gather.md +0 -2
  14. package/.claude/commands/workflow/tools/task-generate-agent.md +81 -8
  15. package/.claude/commands/workflow/tools/task-generate-tdd.md +0 -9
  16. package/.claude/commands/workflow/tools/test-context-gather.md +2 -3
  17. package/.claude/commands/workflow/tools/test-task-generate.md +0 -2
  18. package/.claude/skills/_shared/mermaid-utils.md +584 -0
  19. package/.claude/skills/command-guide/reference/agents/action-planning-agent.md +0 -2
  20. package/.claude/skills/command-guide/reference/commands/workflow/execute.md +1 -1
  21. package/.claude/skills/command-guide/reference/commands/workflow/tools/context-gather.md +1 -2
  22. package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-tdd.md +1 -8
  23. package/.claude/skills/command-guide/reference/commands/workflow/tools/test-context-gather.md +1 -4
  24. package/.claude/skills/command-guide/reference/commands/workflow/tools/test-task-generate.md +0 -2
  25. package/.claude/skills/copyright-docs/SKILL.md +132 -0
  26. package/.claude/skills/copyright-docs/phases/01-metadata-collection.md +78 -0
  27. package/.claude/skills/copyright-docs/phases/01.5-project-exploration.md +150 -0
  28. package/.claude/skills/copyright-docs/phases/02-deep-analysis.md +664 -0
  29. package/.claude/skills/copyright-docs/phases/02.5-consolidation.md +192 -0
  30. package/.claude/skills/copyright-docs/phases/04-document-assembly.md +261 -0
  31. package/.claude/skills/copyright-docs/phases/05-compliance-refinement.md +192 -0
  32. package/.claude/skills/copyright-docs/specs/cpcc-requirements.md +121 -0
  33. package/.claude/skills/copyright-docs/templates/agent-base.md +200 -0
  34. package/.claude/skills/project-analyze/SKILL.md +162 -0
  35. package/.claude/skills/project-analyze/phases/01-requirements-discovery.md +79 -0
  36. package/.claude/skills/project-analyze/phases/02-project-exploration.md +176 -0
  37. package/.claude/skills/project-analyze/phases/03-deep-analysis.md +854 -0
  38. package/.claude/skills/project-analyze/phases/03.5-consolidation.md +233 -0
  39. package/.claude/skills/project-analyze/phases/04-report-generation.md +217 -0
  40. package/.claude/skills/project-analyze/phases/05-iterative-refinement.md +124 -0
  41. package/.claude/skills/project-analyze/specs/quality-standards.md +115 -0
  42. package/.claude/skills/project-analyze/specs/writing-style.md +152 -0
  43. package/.claude/workflows/cli-templates/schemas/conflict-resolution-schema.json +79 -65
  44. package/.claude/workflows/cli-templates/schemas/issue-task-jsonl-schema.json +136 -0
  45. package/.claude/workflows/cli-templates/schemas/issues-jsonl-schema.json +74 -0
  46. package/.claude/workflows/cli-templates/schemas/queue-schema.json +136 -0
  47. package/.claude/workflows/cli-templates/schemas/registry-schema.json +94 -0
  48. package/.claude/workflows/cli-templates/schemas/solution-schema.json +120 -0
  49. package/.claude/workflows/cli-templates/schemas/solutions-jsonl-schema.json +125 -0
  50. package/.codex/prompts/issue-execute.md +266 -0
  51. package/README.md +11 -1
  52. package/ccw/dist/cli.d.ts.map +1 -1
  53. package/ccw/dist/cli.js +25 -0
  54. package/ccw/dist/cli.js.map +1 -1
  55. package/ccw/dist/commands/cli.d.ts.map +1 -1
  56. package/ccw/dist/commands/cli.js +46 -8
  57. package/ccw/dist/commands/cli.js.map +1 -1
  58. package/ccw/dist/commands/issue.d.ts +21 -0
  59. package/ccw/dist/commands/issue.d.ts.map +1 -0
  60. package/ccw/dist/commands/issue.js +895 -0
  61. package/ccw/dist/commands/issue.js.map +1 -0
  62. package/ccw/dist/core/dashboard-generator-patch.js +1 -0
  63. package/ccw/dist/core/dashboard-generator-patch.js.map +1 -1
  64. package/ccw/dist/core/routes/cli-routes.js +2 -2
  65. package/ccw/dist/core/routes/cli-routes.js.map +1 -1
  66. package/ccw/dist/core/routes/issue-routes.d.ts +34 -0
  67. package/ccw/dist/core/routes/issue-routes.d.ts.map +1 -0
  68. package/ccw/dist/core/routes/issue-routes.js +487 -0
  69. package/ccw/dist/core/routes/issue-routes.js.map +1 -0
  70. package/ccw/dist/core/server.d.ts.map +1 -1
  71. package/ccw/dist/core/server.js +17 -2
  72. package/ccw/dist/core/server.js.map +1 -1
  73. package/ccw/dist/tools/claude-cli-tools.d.ts +7 -3
  74. package/ccw/dist/tools/claude-cli-tools.d.ts.map +1 -1
  75. package/ccw/dist/tools/claude-cli-tools.js +31 -17
  76. package/ccw/dist/tools/claude-cli-tools.js.map +1 -1
  77. package/ccw/dist/tools/smart-search.d.ts +25 -0
  78. package/ccw/dist/tools/smart-search.d.ts.map +1 -1
  79. package/ccw/dist/tools/smart-search.js +121 -17
  80. package/ccw/dist/tools/smart-search.js.map +1 -1
  81. package/ccw/src/cli.ts +26 -0
  82. package/ccw/src/commands/cli.ts +49 -7
  83. package/ccw/src/commands/issue.ts +1184 -0
  84. package/ccw/src/core/dashboard-generator-patch.ts +1 -0
  85. package/ccw/src/core/routes/cli-routes.ts +3 -3
  86. package/ccw/src/core/routes/issue-routes.ts +559 -0
  87. package/ccw/src/core/server.ts +17 -2
  88. package/ccw/src/templates/dashboard-css/32-issue-manager.css +2544 -0
  89. package/ccw/src/templates/dashboard-css/33-cli-stream-viewer.css +467 -0
  90. package/ccw/src/templates/dashboard-js/components/cli-history.js +40 -13
  91. package/ccw/src/templates/dashboard-js/components/cli-status.js +26 -2
  92. package/ccw/src/templates/dashboard-js/components/cli-stream-viewer.js +461 -0
  93. package/ccw/src/templates/dashboard-js/components/navigation.js +8 -0
  94. package/ccw/src/templates/dashboard-js/components/notifications.js +16 -0
  95. package/ccw/src/templates/dashboard-js/i18n.js +290 -2
  96. package/ccw/src/templates/dashboard-js/views/cli-manager.js +5 -0
  97. package/ccw/src/templates/dashboard-js/views/history.js +19 -4
  98. package/ccw/src/templates/dashboard-js/views/hook-manager.js +11 -5
  99. package/ccw/src/templates/dashboard-js/views/issue-manager.js +1546 -0
  100. package/ccw/src/templates/dashboard.html +55 -0
  101. package/ccw/src/tools/claude-cli-tools.ts +37 -20
  102. package/ccw/src/tools/smart-search.ts +157 -16
  103. package/codex-lens/src/codexlens/__pycache__/config.cpython-313.pyc +0 -0
  104. package/codex-lens/src/codexlens/config.py +5 -0
  105. package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-313.pyc +0 -0
  106. package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-313.pyc +0 -0
  107. package/codex-lens/src/codexlens/search/hybrid_search.py +144 -11
  108. package/codex-lens/src/codexlens/search/ranking.py +267 -1
  109. package/codex-lens/src/codexlens/semantic/__pycache__/chunker.cpython-313.pyc +0 -0
  110. package/codex-lens/src/codexlens/semantic/chunker.py +55 -10
  111. package/package.json +2 -2
@@ -0,0 +1,132 @@
1
+ ---
2
+ name: copyright-docs
3
+ description: Generate software copyright design specification documents compliant with China Copyright Protection Center (CPCC) standards. Creates complete design documents with Mermaid diagrams based on source code analysis. Use for software copyright registration, generating design specification, creating CPCC-compliant documents, or documenting software for intellectual property protection. Triggers on "软件著作权", "设计说明书", "版权登记", "CPCC", "软著申请".
4
+ allowed-tools: Task, AskUserQuestion, Read, Bash, Glob, Grep, Write
5
+ ---
6
+
7
+ # Software Copyright Documentation Skill
8
+
9
+ Generate CPCC-compliant software design specification documents (软件设计说明书) through multi-phase code analysis.
10
+
11
+ ## Architecture Overview
12
+
13
+ ```
14
+ ┌─────────────────────────────────────────────────────────────────┐
15
+ │ Context-Optimized Architecture │
16
+ ├─────────────────────────────────────────────────────────────────┤
17
+ │ │
18
+ │ Phase 1: Metadata → project-metadata.json │
19
+ │ ↓ │
20
+ │ Phase 2: 6 Parallel → sections/section-N.md (直接写MD) │
21
+ │ Agents ↓ 返回简要JSON │
22
+ │ ↓ │
23
+ │ Phase 2.5: Consolidation → cross-module-summary.md │
24
+ │ Agent ↓ 返回问题列表 │
25
+ │ ↓ │
26
+ │ Phase 4: Assembly → 合并MD + 跨模块总结 │
27
+ │ ↓ │
28
+ │ Phase 5: Refinement → 最终文档 │
29
+ │ │
30
+ └─────────────────────────────────────────────────────────────────┘
31
+ ```
32
+
33
+ ## Key Design Principles
34
+
35
+ 1. **Agent 直接输出 MD**: 避免 JSON → MD 转换的上下文开销
36
+ 2. **简要返回**: Agent 只返回路径+摘要,不返回完整内容
37
+ 3. **汇总 Agent**: 独立 Agent 负责跨模块问题检测
38
+ 4. **引用合并**: Phase 4 读取文件合并,不在上下文中传递
39
+
40
+ ## Execution Flow
41
+
42
+ ```
43
+ ┌─────────────────────────────────────────────────────────────────┐
44
+ │ Phase 1: Metadata Collection │
45
+ │ → Read: phases/01-metadata-collection.md │
46
+ │ → Collect: software name, version, category, scope │
47
+ │ → Output: project-metadata.json │
48
+ ├─────────────────────────────────────────────────────────────────┤
49
+ │ Phase 2: Deep Code Analysis (6 Parallel Agents) │
50
+ │ → Read: phases/02-deep-analysis.md │
51
+ │ → Reference: specs/cpcc-requirements.md │
52
+ │ → Each Agent: 分析代码 → 直接写 sections/section-N.md │
53
+ │ → Return: {"status", "output_file", "summary", "cross_notes"} │
54
+ ├─────────────────────────────────────────────────────────────────┤
55
+ │ Phase 2.5: Consolidation (New!) │
56
+ │ → Read: phases/02.5-consolidation.md │
57
+ │ → Input: Agent 返回的简要信息 + cross_module_notes │
58
+ │ → Analyze: 一致性/完整性/关联性/质量检查 │
59
+ │ → Output: cross-module-summary.md │
60
+ │ → Return: {"issues": {errors, warnings, info}, "stats"} │
61
+ ├─────────────────────────────────────────────────────────────────┤
62
+ │ Phase 4: Document Assembly │
63
+ │ → Read: phases/04-document-assembly.md │
64
+ │ → Check: 如有 errors,提示用户处理 │
65
+ │ → Merge: Section 1 + sections/*.md + 跨模块附录 │
66
+ │ → Output: {软件名称}-软件设计说明书.md │
67
+ ├─────────────────────────────────────────────────────────────────┤
68
+ │ Phase 5: Compliance Review & Refinement │
69
+ │ → Read: phases/05-compliance-refinement.md │
70
+ │ → Reference: specs/cpcc-requirements.md │
71
+ │ → Loop: 发现问题 → 提问 → 修复 → 重新检查 │
72
+ └─────────────────────────────────────────────────────────────────┘
73
+ ```
74
+
75
+ ## Document Sections (7 Required)
76
+
77
+ | Section | Title | Diagram | Agent |
78
+ |---------|-------|---------|-------|
79
+ | 1 | 软件概述 | - | Phase 4 生成 |
80
+ | 2 | 系统架构图 | graph TD | architecture |
81
+ | 3 | 功能模块设计 | flowchart TD | functions |
82
+ | 4 | 核心算法与流程 | flowchart TD | algorithms |
83
+ | 5 | 数据结构设计 | classDiagram | data_structures |
84
+ | 6 | 接口设计 | sequenceDiagram | interfaces |
85
+ | 7 | 异常处理设计 | flowchart TD | exceptions |
86
+
87
+ ## Directory Setup
88
+
89
+ ```javascript
90
+ // 生成时间戳目录名
91
+ const timestamp = new Date().toISOString().slice(0,19).replace(/[-:T]/g, '');
92
+ const dir = `.workflow/.scratchpad/copyright-${timestamp}`;
93
+
94
+ // Windows (cmd)
95
+ Bash(`mkdir "${dir}\\sections"`);
96
+ Bash(`mkdir "${dir}\\iterations"`);
97
+
98
+ // Unix/macOS
99
+ // Bash(`mkdir -p "${dir}/sections" "${dir}/iterations"`);
100
+ ```
101
+
102
+ ## Output Structure
103
+
104
+ ```
105
+ .workflow/.scratchpad/copyright-{timestamp}/
106
+ ├── project-metadata.json # Phase 1
107
+ ├── sections/ # Phase 2 (Agent 直接写入)
108
+ │ ├── section-2-architecture.md
109
+ │ ├── section-3-functions.md
110
+ │ ├── section-4-algorithms.md
111
+ │ ├── section-5-data-structures.md
112
+ │ ├── section-6-interfaces.md
113
+ │ └── section-7-exceptions.md
114
+ ├── cross-module-summary.md # Phase 2.5
115
+ ├── iterations/ # Phase 5
116
+ │ ├── v1.md
117
+ │ └── v2.md
118
+ └── {软件名称}-软件设计说明书.md # Final Output
119
+ ```
120
+
121
+ ## Reference Documents
122
+
123
+ | Document | Purpose |
124
+ |----------|---------|
125
+ | [phases/01-metadata-collection.md](phases/01-metadata-collection.md) | Software info collection |
126
+ | [phases/02-deep-analysis.md](phases/02-deep-analysis.md) | 6-agent parallel analysis |
127
+ | [phases/02.5-consolidation.md](phases/02.5-consolidation.md) | Cross-module consolidation |
128
+ | [phases/04-document-assembly.md](phases/04-document-assembly.md) | Document merge & assembly |
129
+ | [phases/05-compliance-refinement.md](phases/05-compliance-refinement.md) | Iterative refinement loop |
130
+ | [specs/cpcc-requirements.md](specs/cpcc-requirements.md) | CPCC compliance checklist |
131
+ | [templates/agent-base.md](templates/agent-base.md) | Agent prompt templates |
132
+ | [../_shared/mermaid-utils.md](../_shared/mermaid-utils.md) | Shared Mermaid utilities |
@@ -0,0 +1,78 @@
1
+ # Phase 1: Metadata Collection
2
+
3
+ Collect software metadata for document header and context.
4
+
5
+ ## Execution
6
+
7
+ ### Step 1: Software Name & Version
8
+
9
+ ```javascript
10
+ AskUserQuestion({
11
+ questions: [{
12
+ question: "请输入软件名称(将显示在文档页眉):",
13
+ header: "软件名称",
14
+ multiSelect: false,
15
+ options: [
16
+ {label: "自动检测", description: "从 package.json 或项目配置读取"},
17
+ {label: "手动输入", description: "输入自定义名称"}
18
+ ]
19
+ }]
20
+ })
21
+ ```
22
+
23
+ ### Step 2: Software Category
24
+
25
+ ```javascript
26
+ AskUserQuestion({
27
+ questions: [{
28
+ question: "软件属于哪种类型?",
29
+ header: "软件类型",
30
+ multiSelect: false,
31
+ options: [
32
+ {label: "命令行工具 (CLI)", description: "重点描述命令、参数"},
33
+ {label: "后端服务/API", description: "重点描述端点、协议"},
34
+ {label: "SDK/库", description: "重点描述接口、集成"},
35
+ {label: "数据处理系统", description: "重点描述数据流、转换"},
36
+ {label: "自动化脚本", description: "重点描述工作流、触发器"}
37
+ ]
38
+ }]
39
+ })
40
+ ```
41
+
42
+ ### Step 3: Scope Definition
43
+
44
+ ```javascript
45
+ AskUserQuestion({
46
+ questions: [{
47
+ question: "分析范围是什么?",
48
+ header: "分析范围",
49
+ multiSelect: false,
50
+ options: [
51
+ {label: "整个项目", description: "分析全部源代码"},
52
+ {label: "指定目录", description: "仅分析 src/ 或其他目录"},
53
+ {label: "自定义路径", description: "手动指定路径"}
54
+ ]
55
+ }]
56
+ })
57
+ ```
58
+
59
+ ## Output
60
+
61
+ Save metadata to `project-metadata.json`:
62
+
63
+ ```json
64
+ {
65
+ "software_name": "智能数据分析系统",
66
+ "version": "V1.0.0",
67
+ "category": "后端服务/API",
68
+ "scope_path": "src/",
69
+ "tech_stack": {
70
+ "language": "TypeScript",
71
+ "runtime": "Node.js 18+",
72
+ "framework": "Express.js",
73
+ "dependencies": ["mongoose", "redis", "bull"]
74
+ },
75
+ "entry_points": ["src/index.ts", "src/cli.ts"],
76
+ "main_modules": ["auth", "data", "api", "worker"]
77
+ }
78
+ ```
@@ -0,0 +1,150 @@
1
+ # Phase 1.5: Project Exploration
2
+
3
+ 基于元数据,启动并行探索 Agent 收集代码信息。
4
+
5
+ ## Execution
6
+
7
+ ### Step 1: Intelligent Angle Selection
8
+
9
+ ```javascript
10
+ // 根据软件类型选择探索角度
11
+ const ANGLE_PRESETS = {
12
+ 'CLI': ['architecture', 'commands', 'algorithms', 'exceptions'],
13
+ 'API': ['architecture', 'endpoints', 'data-structures', 'interfaces'],
14
+ 'SDK': ['architecture', 'interfaces', 'data-structures', 'algorithms'],
15
+ 'DataProcessing': ['architecture', 'algorithms', 'data-structures', 'dataflow'],
16
+ 'Automation': ['architecture', 'algorithms', 'exceptions', 'dataflow']
17
+ };
18
+
19
+ // 从 metadata.category 映射到预设
20
+ function getCategoryKey(category) {
21
+ if (category.includes('CLI') || category.includes('命令行')) return 'CLI';
22
+ if (category.includes('API') || category.includes('后端')) return 'API';
23
+ if (category.includes('SDK') || category.includes('库')) return 'SDK';
24
+ if (category.includes('数据处理')) return 'DataProcessing';
25
+ if (category.includes('自动化')) return 'Automation';
26
+ return 'API'; // default
27
+ }
28
+
29
+ const categoryKey = getCategoryKey(metadata.category);
30
+ const selectedAngles = ANGLE_PRESETS[categoryKey];
31
+
32
+ console.log(`
33
+ ## Exploration Plan
34
+
35
+ Software: ${metadata.software_name}
36
+ Category: ${metadata.category} → ${categoryKey}
37
+ Selected Angles: ${selectedAngles.join(', ')}
38
+
39
+ Launching ${selectedAngles.length} parallel explorations...
40
+ `);
41
+ ```
42
+
43
+ ### Step 2: Launch Parallel Agents (Direct Output)
44
+
45
+ **⚠️ CRITICAL**: Agents write output files directly.
46
+
47
+ ```javascript
48
+ const explorationTasks = selectedAngles.map((angle, index) =>
49
+ Task({
50
+ subagent_type: "cli-explore-agent",
51
+ run_in_background: false,
52
+ description: `Explore: ${angle}`,
53
+ prompt: `
54
+ ## Exploration Objective
55
+ 为 CPCC 软著申请文档执行 **${angle}** 探索。
56
+
57
+ ## Assigned Context
58
+ - **Exploration Angle**: ${angle}
59
+ - **Software Name**: ${metadata.software_name}
60
+ - **Scope Path**: ${metadata.scope_path}
61
+ - **Category**: ${metadata.category}
62
+ - **Exploration Index**: ${index + 1} of ${selectedAngles.length}
63
+ - **Output File**: ${sessionFolder}/exploration-${angle}.json
64
+
65
+ ## MANDATORY FIRST STEPS
66
+ 1. Run: ccw tool exec get_modules_by_depth '{}' (project structure)
67
+ 2. Run: rg -l "{relevant_keyword}" --type ts (locate relevant files)
68
+ 3. Analyze from ${angle} perspective
69
+
70
+ ## Exploration Strategy (${angle} focus)
71
+
72
+ **Step 1: Structural Scan**
73
+ - 识别与 ${angle} 相关的模块和文件
74
+ - 分析导入/导出关系
75
+
76
+ **Step 2: Pattern Recognition**
77
+ - ${angle} 相关的设计模式
78
+ - 代码组织方式
79
+
80
+ **Step 3: Write Output**
81
+ - 输出 JSON 到指定路径
82
+
83
+ ## Expected Output Schema
84
+
85
+ **File**: ${sessionFolder}/exploration-${angle}.json
86
+
87
+ \`\`\`json
88
+ {
89
+ "angle": "${angle}",
90
+ "findings": {
91
+ "structure": [
92
+ { "component": "...", "type": "module|layer|service", "path": "...", "description": "..." }
93
+ ],
94
+ "patterns": [
95
+ { "name": "...", "usage": "...", "files": ["path1", "path2"] }
96
+ ],
97
+ "key_files": [
98
+ { "path": "src/file.ts", "relevance": 0.85, "rationale": "Core ${angle} logic" }
99
+ ]
100
+ },
101
+ "insights": [
102
+ { "observation": "...", "cpcc_section": "2|3|4|5|6|7", "recommendation": "..." }
103
+ ],
104
+ "_metadata": {
105
+ "exploration_angle": "${angle}",
106
+ "exploration_index": ${index + 1},
107
+ "software_name": "${metadata.software_name}",
108
+ "timestamp": "ISO8601"
109
+ }
110
+ }
111
+ \`\`\`
112
+
113
+ ## Success Criteria
114
+ - [ ] get_modules_by_depth 执行完成
115
+ - [ ] 至少识别 3 个相关文件
116
+ - [ ] patterns 包含具体代码示例
117
+ - [ ] insights 关联到 CPCC 章节 (2-7)
118
+ - [ ] JSON 输出到指定路径
119
+ - [ ] Return: 2-3 句话总结 ${angle} 发现
120
+ `
121
+ })
122
+ );
123
+
124
+ // Execute all exploration tasks in parallel
125
+ ```
126
+
127
+ ## Output
128
+
129
+ Session folder structure after exploration:
130
+
131
+ ```
132
+ ${sessionFolder}/
133
+ ├── exploration-architecture.json
134
+ ├── exploration-{angle2}.json
135
+ ├── exploration-{angle3}.json
136
+ └── exploration-{angle4}.json
137
+ ```
138
+
139
+ ## Downstream Usage (Phase 2 Analysis Input)
140
+
141
+ Phase 2 agents read exploration files as context:
142
+
143
+ ```javascript
144
+ // Discover exploration files by known angle pattern
145
+ const explorationData = {};
146
+ selectedAngles.forEach(angle => {
147
+ const filePath = `${sessionFolder}/exploration-${angle}.json`;
148
+ explorationData[angle] = JSON.parse(Read(filePath));
149
+ });
150
+ ```