moai-adk 0.8.1__py3-none-any.whl → 0.8.2__py3-none-any.whl
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.
Potentially problematic release.
This version of moai-adk might be problematic. Click here for more details.
- moai_adk/cli/commands/update.py +15 -4
- moai_adk/core/tags/__init__.py +87 -0
- moai_adk/core/tags/ci_validator.py +435 -0
- moai_adk/core/tags/cli.py +283 -0
- moai_adk/core/tags/generator.py +109 -0
- moai_adk/core/tags/inserter.py +99 -0
- moai_adk/core/tags/mapper.py +126 -0
- moai_adk/core/tags/parser.py +76 -0
- moai_adk/core/tags/pre_commit_validator.py +355 -0
- moai_adk/core/tags/reporter.py +959 -0
- moai_adk/core/tags/tags.py +149 -0
- moai_adk/core/tags/validator.py +897 -0
- moai_adk/templates/.claude/agents/alfred/cc-manager.md +25 -2
- moai_adk/templates/.claude/agents/alfred/debug-helper.md +24 -12
- moai_adk/templates/.claude/agents/alfred/doc-syncer.md +19 -12
- moai_adk/templates/.claude/agents/alfred/git-manager.md +20 -12
- moai_adk/templates/.claude/agents/alfred/implementation-planner.md +19 -12
- moai_adk/templates/.claude/agents/alfred/project-manager.md +29 -2
- moai_adk/templates/.claude/agents/alfred/quality-gate.md +25 -2
- moai_adk/templates/.claude/agents/alfred/skill-factory.md +30 -2
- moai_adk/templates/.claude/agents/alfred/spec-builder.md +26 -11
- moai_adk/templates/.claude/agents/alfred/tag-agent.md +30 -8
- moai_adk/templates/.claude/agents/alfred/tdd-implementer.md +27 -12
- moai_adk/templates/.claude/agents/alfred/trust-checker.md +25 -2
- moai_adk/templates/.claude/commands/alfred/0-project.md +5 -0
- moai_adk/templates/.claude/commands/alfred/1-plan.md +17 -4
- moai_adk/templates/.claude/commands/alfred/2-run.md +7 -0
- moai_adk/templates/.claude/commands/alfred/3-sync.md +6 -0
- moai_adk/templates/.claude/hooks/alfred/.moai/cache/version-check.json +9 -0
- moai_adk/templates/.claude/hooks/alfred/README.md +258 -145
- moai_adk/templates/.claude/hooks/alfred/TROUBLESHOOTING.md +471 -0
- moai_adk/templates/.claude/hooks/alfred/alfred_hooks.py +92 -57
- moai_adk/templates/.claude/hooks/alfred/core/version_cache.py +198 -0
- moai_adk/templates/.claude/hooks/alfred/notification__handle_events.py +102 -0
- moai_adk/templates/.claude/hooks/alfred/post_tool__log_changes.py +102 -0
- moai_adk/templates/.claude/hooks/alfred/pre_tool__auto_checkpoint.py +108 -0
- moai_adk/templates/.claude/hooks/alfred/session_end__cleanup.py +102 -0
- moai_adk/templates/.claude/hooks/alfred/session_start__show_project_info.py +102 -0
- moai_adk/templates/.claude/hooks/alfred/{core → shared/core}/project.py +269 -13
- moai_adk/templates/.claude/hooks/alfred/shared/core/version_cache.py +198 -0
- moai_adk/templates/.claude/hooks/alfred/{handlers → shared/handlers}/session.py +21 -7
- moai_adk/templates/.claude/hooks/alfred/stop__handle_interrupt.py +102 -0
- moai_adk/templates/.claude/hooks/alfred/subagent_stop__handle_subagent_end.py +102 -0
- moai_adk/templates/.claude/hooks/alfred/user_prompt__jit_load_docs.py +120 -0
- moai_adk/templates/.claude/settings.json +5 -5
- moai_adk/templates/.claude/skills/moai-foundation-ears/SKILL.md +9 -6
- moai_adk/templates/.claude/skills/moai-spec-authoring/README.md +56 -56
- moai_adk/templates/.claude/skills/moai-spec-authoring/SKILL.md +101 -100
- moai_adk/templates/.claude/skills/moai-spec-authoring/examples/validate-spec.sh +3 -3
- moai_adk/templates/.claude/skills/moai-spec-authoring/examples.md +219 -219
- moai_adk/templates/.claude/skills/moai-spec-authoring/reference.md +287 -287
- moai_adk/templates/.github/ISSUE_TEMPLATE/spec.yml +9 -11
- moai_adk/templates/.github/PULL_REQUEST_TEMPLATE.md +9 -21
- moai_adk/templates/.github/workflows/moai-release-create.yml +100 -0
- moai_adk/templates/.github/workflows/moai-release-pipeline.yml +182 -0
- moai_adk/templates/.github/workflows/release.yml +49 -0
- moai_adk/templates/.github/workflows/tag-report.yml +261 -0
- moai_adk/templates/.github/workflows/tag-validation.yml +176 -0
- moai_adk/templates/.moai/config.json +6 -1
- moai_adk/templates/.moai/hooks/install.sh +79 -0
- moai_adk/templates/.moai/hooks/pre-commit.sh +66 -0
- moai_adk/templates/CLAUDE.md +39 -40
- moai_adk/templates/src/moai_adk/core/__init__.py +5 -0
- moai_adk/templates/src/moai_adk/core/tags/__init__.py +87 -0
- moai_adk/templates/src/moai_adk/core/tags/ci_validator.py +435 -0
- moai_adk/templates/src/moai_adk/core/tags/cli.py +283 -0
- moai_adk/templates/src/moai_adk/core/tags/pre_commit_validator.py +355 -0
- moai_adk/templates/src/moai_adk/core/tags/reporter.py +959 -0
- moai_adk/templates/src/moai_adk/core/tags/validator.py +897 -0
- {moai_adk-0.8.1.dist-info → moai_adk-0.8.2.dist-info}/METADATA +226 -1
- {moai_adk-0.8.1.dist-info → moai_adk-0.8.2.dist-info}/RECORD +83 -50
- moai_adk/templates/.claude/hooks/alfred/HOOK_SCHEMA_VALIDATION.md +0 -313
- moai_adk/templates/.moai/memory/config-schema.md +0 -444
- moai_adk/templates/.moai/memory/gitflow-protection-policy.md +0 -220
- moai_adk/templates/.moai/memory/spec-metadata.md +0 -356
- /moai_adk/templates/.claude/hooks/alfred/{core → shared/core}/__init__.py +0 -0
- /moai_adk/templates/.claude/hooks/alfred/{core → shared/core}/checkpoint.py +0 -0
- /moai_adk/templates/.claude/hooks/alfred/{core → shared/core}/context.py +0 -0
- /moai_adk/templates/.claude/hooks/alfred/{core → shared/core}/tags.py +0 -0
- /moai_adk/templates/.claude/hooks/alfred/{handlers → shared/handlers}/__init__.py +0 -0
- /moai_adk/templates/.claude/hooks/alfred/{handlers → shared/handlers}/notification.py +0 -0
- /moai_adk/templates/.claude/hooks/alfred/{handlers → shared/handlers}/tool.py +0 -0
- /moai_adk/templates/.claude/hooks/alfred/{handlers → shared/handlers}/user.py +0 -0
- /moai_adk/templates/.moai/memory/{issue-label-mapping.md → ISSUE-LABEL-MAPPING.md} +0 -0
- {moai_adk-0.8.1.dist-info → moai_adk-0.8.2.dist-info}/WHEEL +0 -0
- {moai_adk-0.8.1.dist-info → moai_adk-0.8.2.dist-info}/entry_points.txt +0 -0
- {moai_adk-0.8.1.dist-info → moai_adk-0.8.2.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: moai-spec-authoring
|
|
3
|
-
version: 1.
|
|
3
|
+
version: 1.2.0
|
|
4
4
|
created: 2025-10-23
|
|
5
|
-
updated: 2025-10-
|
|
5
|
+
updated: 2025-10-29
|
|
6
6
|
status: active
|
|
7
|
-
description: SPEC
|
|
7
|
+
description: SPEC document authoring guide - YAML metadata, EARS syntax (5 patterns with Unwanted Behaviors), validation checklist
|
|
8
8
|
keywords: ['spec', 'authoring', 'ears', 'metadata', 'requirements', 'tdd', 'planning']
|
|
9
9
|
allowed-tools:
|
|
10
10
|
- Read
|
|
@@ -19,200 +19,201 @@ allowed-tools:
|
|
|
19
19
|
| Field | Value |
|
|
20
20
|
| ----- | ----- |
|
|
21
21
|
| **Skill Name** | moai-spec-authoring |
|
|
22
|
-
| **Version** | 1.
|
|
22
|
+
| **Version** | 1.2.0 (2025-10-29) |
|
|
23
23
|
| **Allowed tools** | Read, Bash, Glob |
|
|
24
|
-
| **Auto-load** | `/alfred:1-plan`, SPEC
|
|
24
|
+
| **Auto-load** | `/alfred:1-plan`, SPEC authoring tasks |
|
|
25
25
|
| **Tier** | Foundation |
|
|
26
26
|
|
|
27
27
|
---
|
|
28
28
|
|
|
29
29
|
## What It Does
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
Comprehensive guide for authoring SPEC documents in MoAI-ADK. Provides YAML metadata structure (7 required + 9 optional fields), official EARS requirement syntax (5 patterns including Unwanted Behaviors), version management lifecycle, TAG integration, and validation strategies.
|
|
32
32
|
|
|
33
|
-
|
|
34
|
-
-
|
|
35
|
-
-
|
|
36
|
-
- EARS
|
|
37
|
-
-
|
|
38
|
-
-
|
|
39
|
-
- `/alfred:1-plan`
|
|
33
|
+
**Key capabilities**:
|
|
34
|
+
- Step-by-step SPEC creation workflow
|
|
35
|
+
- Complete metadata field reference with lifecycle rules
|
|
36
|
+
- EARS syntax templates and real-world patterns
|
|
37
|
+
- Pre-submission validation checklist
|
|
38
|
+
- Common pitfalls prevention guide
|
|
39
|
+
- `/alfred:1-plan` workflow integration
|
|
40
40
|
|
|
41
41
|
---
|
|
42
42
|
|
|
43
43
|
## When to Use
|
|
44
44
|
|
|
45
|
-
|
|
46
|
-
- `/alfred:1-plan`
|
|
47
|
-
- SPEC
|
|
48
|
-
-
|
|
49
|
-
-
|
|
45
|
+
**Automatic triggers**:
|
|
46
|
+
- `/alfred:1-plan` command execution
|
|
47
|
+
- SPEC document creation requests
|
|
48
|
+
- Requirements clarification discussions
|
|
49
|
+
- Feature planning sessions
|
|
50
50
|
|
|
51
|
-
|
|
52
|
-
- SPEC
|
|
53
|
-
-
|
|
54
|
-
-
|
|
55
|
-
- EARS
|
|
51
|
+
**Manual invocation**:
|
|
52
|
+
- Learn SPEC authoring best practices
|
|
53
|
+
- Validate existing SPEC documents
|
|
54
|
+
- Troubleshoot metadata issues
|
|
55
|
+
- Understand EARS syntax patterns
|
|
56
56
|
|
|
57
57
|
---
|
|
58
58
|
|
|
59
59
|
## Quick Start: 5-Step SPEC Creation
|
|
60
60
|
|
|
61
|
-
### Step 1: SPEC
|
|
61
|
+
### Step 1: Initialize SPEC Directory
|
|
62
62
|
|
|
63
63
|
```bash
|
|
64
64
|
mkdir -p .moai/specs/SPEC-{DOMAIN}-{NUMBER}
|
|
65
|
-
#
|
|
65
|
+
# Example: Authentication feature
|
|
66
66
|
mkdir -p .moai/specs/SPEC-AUTH-001
|
|
67
67
|
```
|
|
68
68
|
|
|
69
|
-
### Step 2: YAML Front Matter
|
|
69
|
+
### Step 2: Write YAML Front Matter
|
|
70
70
|
|
|
71
71
|
```yaml
|
|
72
72
|
---
|
|
73
73
|
id: AUTH-001
|
|
74
74
|
version: 0.0.1
|
|
75
75
|
status: draft
|
|
76
|
-
created: 2025-10-
|
|
77
|
-
updated: 2025-10-
|
|
76
|
+
created: 2025-10-29
|
|
77
|
+
updated: 2025-10-29
|
|
78
78
|
author: @YourGitHubHandle
|
|
79
79
|
priority: high
|
|
80
80
|
---
|
|
81
81
|
```
|
|
82
82
|
|
|
83
|
-
### Step 3: SPEC
|
|
83
|
+
### Step 3: Add SPEC Title & HISTORY
|
|
84
84
|
|
|
85
85
|
```markdown
|
|
86
86
|
# @SPEC:AUTH-001: JWT Authentication System
|
|
87
87
|
|
|
88
88
|
## HISTORY
|
|
89
89
|
|
|
90
|
-
### v0.0.1 (2025-10-
|
|
91
|
-
- **INITIAL**: JWT
|
|
90
|
+
### v0.0.1 (2025-10-29)
|
|
91
|
+
- **INITIAL**: JWT authentication SPEC draft created
|
|
92
92
|
- **AUTHOR**: @YourHandle
|
|
93
93
|
```
|
|
94
94
|
|
|
95
|
-
### Step 4: Environment & Assumptions
|
|
95
|
+
### Step 4: Define Environment & Assumptions
|
|
96
96
|
|
|
97
97
|
```markdown
|
|
98
98
|
## Environment
|
|
99
99
|
|
|
100
|
-
**Runtime**: Node.js 20.x
|
|
100
|
+
**Runtime**: Node.js 20.x or later
|
|
101
101
|
**Framework**: Express.js
|
|
102
102
|
**Database**: PostgreSQL 15+
|
|
103
103
|
|
|
104
104
|
## Assumptions
|
|
105
105
|
|
|
106
|
-
1.
|
|
107
|
-
2. JWT
|
|
108
|
-
3.
|
|
106
|
+
1. User credentials stored in PostgreSQL
|
|
107
|
+
2. JWT secrets managed via environment variables
|
|
108
|
+
3. Server clock synchronized with NTP
|
|
109
109
|
```
|
|
110
110
|
|
|
111
|
-
### Step 5: EARS
|
|
111
|
+
### Step 5: Write EARS Requirements
|
|
112
112
|
|
|
113
113
|
```markdown
|
|
114
114
|
## Requirements
|
|
115
115
|
|
|
116
116
|
### Ubiquitous Requirements
|
|
117
|
-
**UR-001**:
|
|
117
|
+
**UR-001**: The system shall provide JWT-based authentication.
|
|
118
118
|
|
|
119
119
|
### Event-driven Requirements
|
|
120
|
-
**ER-001**: WHEN
|
|
120
|
+
**ER-001**: WHEN the user submits valid credentials, the system shall issue a JWT token with 15-minute expiration.
|
|
121
121
|
|
|
122
122
|
### State-driven Requirements
|
|
123
|
-
**SR-001**: WHILE
|
|
123
|
+
**SR-001**: WHILE the user is in an authenticated state, the system shall permit access to protected resources.
|
|
124
124
|
|
|
125
125
|
### Optional Features
|
|
126
|
-
**OF-001**: WHERE
|
|
126
|
+
**OF-001**: WHERE multi-factor authentication is enabled, the system can require OTP verification after password confirmation.
|
|
127
127
|
|
|
128
|
-
###
|
|
129
|
-
**
|
|
128
|
+
### Unwanted Behaviors
|
|
129
|
+
**UB-001**: IF a token has expired, THEN the system shall deny access and return HTTP 401.
|
|
130
130
|
```
|
|
131
131
|
|
|
132
132
|
---
|
|
133
133
|
|
|
134
|
-
## EARS
|
|
134
|
+
## Five EARS Pattern Overview
|
|
135
135
|
|
|
136
|
-
|
|
|
137
|
-
|
|
138
|
-
| **Ubiquitous** | shall |
|
|
139
|
-
| **Event-driven** | WHEN |
|
|
140
|
-
| **State-driven** | WHILE |
|
|
141
|
-
| **Optional** | WHERE |
|
|
142
|
-
| **
|
|
136
|
+
| Pattern | Keyword | Purpose | Example |
|
|
137
|
+
|---------|---------|---------|---------|
|
|
138
|
+
| **Ubiquitous** | shall | Core functionality always active | "The system shall provide login capability" |
|
|
139
|
+
| **Event-driven** | WHEN | Response to specific events | "WHEN login fails, display error" |
|
|
140
|
+
| **State-driven** | WHILE | Persistent behavior during state | "WHILE in authenticated state, permit access" |
|
|
141
|
+
| **Optional** | WHERE | Conditional features based on flags | "WHERE premium enabled, unlock feature" |
|
|
142
|
+
| **Unwanted Behaviors** | IF-THEN | Error handling, quality gates, business rules | "IF token expires, deny access + return 401" |
|
|
143
143
|
|
|
144
144
|
---
|
|
145
145
|
|
|
146
|
-
##
|
|
146
|
+
## Seven Required Metadata Fields
|
|
147
147
|
|
|
148
|
-
1. **id**: `<DOMAIN>-<NUMBER>` (
|
|
149
|
-
2. **version**: `MAJOR.MINOR.PATCH` (
|
|
148
|
+
1. **id**: `<DOMAIN>-<NUMBER>` (e.g., `AUTH-001`) - Immutable identifier
|
|
149
|
+
2. **version**: `MAJOR.MINOR.PATCH` (e.g., `0.0.1`) - Semantic versioning
|
|
150
150
|
3. **status**: `draft` | `active` | `completed` | `deprecated`
|
|
151
|
-
4. **created**: `YYYY-MM-DD` -
|
|
152
|
-
5. **updated**: `YYYY-MM-DD` -
|
|
153
|
-
6. **author**: `@GitHubHandle` -
|
|
151
|
+
4. **created**: `YYYY-MM-DD` - Initial creation date
|
|
152
|
+
5. **updated**: `YYYY-MM-DD` - Final modification date
|
|
153
|
+
6. **author**: `@GitHubHandle` - Primary author (@ prefix required)
|
|
154
154
|
7. **priority**: `critical` | `high` | `medium` | `low`
|
|
155
155
|
|
|
156
|
-
|
|
157
|
-
- `0.0.x` → draft (
|
|
158
|
-
- `0.1.0` → completed (
|
|
159
|
-
- `1.0.0` → stable (
|
|
156
|
+
**Version Lifecycle**:
|
|
157
|
+
- `0.0.x` → draft (authoring phase)
|
|
158
|
+
- `0.1.0` → completed (implementation done)
|
|
159
|
+
- `1.0.0` → stable (production-ready)
|
|
160
160
|
|
|
161
161
|
---
|
|
162
162
|
|
|
163
|
-
##
|
|
164
|
-
|
|
165
|
-
###
|
|
166
|
-
- [ ] 7
|
|
167
|
-
- [ ] `author`
|
|
168
|
-
- [ ] `version`
|
|
169
|
-
- [ ] `id
|
|
170
|
-
|
|
171
|
-
###
|
|
172
|
-
- [ ] YAML Front Matter
|
|
173
|
-
- [ ]
|
|
174
|
-
- [ ] HISTORY
|
|
175
|
-
- [ ] Environment
|
|
176
|
-
- [ ] Assumptions
|
|
177
|
-
- [ ] Requirements
|
|
178
|
-
- [ ] Traceability
|
|
179
|
-
|
|
180
|
-
### EARS
|
|
181
|
-
- [ ] Ubiquitous: "shall" +
|
|
182
|
-
- [ ] Event-driven: "WHEN [
|
|
183
|
-
- [ ] State-driven: "WHILE [
|
|
184
|
-
- [ ] Optional: "WHERE [
|
|
185
|
-
- [ ]
|
|
163
|
+
## Validation Checklist
|
|
164
|
+
|
|
165
|
+
### Metadata Validation
|
|
166
|
+
- [ ] All 7 required fields present
|
|
167
|
+
- [ ] `author` field includes @ prefix
|
|
168
|
+
- [ ] `version` format is `0.x.y`
|
|
169
|
+
- [ ] `id` is not duplicated (`rg "@SPEC:AUTH-001" -n .moai/specs/`)
|
|
170
|
+
|
|
171
|
+
### Content Validation
|
|
172
|
+
- [ ] YAML Front Matter complete
|
|
173
|
+
- [ ] Title includes `@SPEC:{ID}` TAG block
|
|
174
|
+
- [ ] HISTORY section has v0.0.1 INITIAL entry
|
|
175
|
+
- [ ] Environment section defined
|
|
176
|
+
- [ ] Assumptions section defined (minimum 3 items)
|
|
177
|
+
- [ ] Requirements section uses EARS patterns
|
|
178
|
+
- [ ] Traceability section shows TAG chain structure
|
|
179
|
+
|
|
180
|
+
### EARS Syntax Validation
|
|
181
|
+
- [ ] Ubiquitous: "shall" + capability
|
|
182
|
+
- [ ] Event-driven: Starts with "WHEN [trigger]"
|
|
183
|
+
- [ ] State-driven: Starts with "WHILE [state]"
|
|
184
|
+
- [ ] Optional: Starts with "WHERE [feature]", uses "can"
|
|
185
|
+
- [ ] Unwanted Behaviors: "IF-THEN" or direct constraint expression
|
|
186
186
|
|
|
187
187
|
---
|
|
188
188
|
|
|
189
|
-
##
|
|
189
|
+
## Common Pitfalls
|
|
190
190
|
|
|
191
|
-
1. ❌ **
|
|
192
|
-
2. ❌ **HISTORY
|
|
193
|
-
3. ❌
|
|
194
|
-
4. ❌
|
|
195
|
-
5. ❌
|
|
196
|
-
6. ❌ **EARS
|
|
191
|
+
1. ❌ **Changing SPEC ID after assignment** → Breaks TAG chain
|
|
192
|
+
2. ❌ **Skipping HISTORY updates** → Content changes without audit trail
|
|
193
|
+
3. ❌ **Jumping version numbers** → v0.0.1 → v1.0.0 without intermediate steps
|
|
194
|
+
4. ❌ **Ambiguous requirements** → "Fast and user-friendly" (unmeasurable)
|
|
195
|
+
5. ❌ **Missing @ prefix in author** → `author: Goos` instead of `author: @Goos`
|
|
196
|
+
6. ❌ **Mixing EARS patterns** → Multiple keywords in single requirement
|
|
197
197
|
|
|
198
198
|
---
|
|
199
199
|
|
|
200
200
|
## Related Skills
|
|
201
201
|
|
|
202
|
-
- `moai-foundation-ears` - EARS
|
|
203
|
-
- `moai-foundation-specs` -
|
|
204
|
-
- `moai-foundation-tags` - TAG
|
|
205
|
-
- `moai-alfred-spec-metadata-validation` -
|
|
202
|
+
- `moai-foundation-ears` - Official EARS syntax patterns
|
|
203
|
+
- `moai-foundation-specs` - Metadata validation automation
|
|
204
|
+
- `moai-foundation-tags` - TAG system integration
|
|
205
|
+
- `moai-alfred-spec-metadata-validation` - Automated validation
|
|
206
206
|
|
|
207
207
|
---
|
|
208
208
|
|
|
209
|
-
##
|
|
209
|
+
## Detailed Reference
|
|
210
210
|
|
|
211
|
-
-
|
|
212
|
-
-
|
|
211
|
+
- **Full Metadata Reference**: [reference.md](./reference.md)
|
|
212
|
+
- **Practical Examples**: [examples.md](./examples.md)
|
|
213
213
|
|
|
214
214
|
---
|
|
215
215
|
|
|
216
|
-
**Last Updated**: 2025-10-
|
|
216
|
+
**Last Updated**: 2025-10-29
|
|
217
|
+
**Version**: 1.2.0
|
|
217
218
|
**Maintained By**: MoAI-ADK Team
|
|
218
|
-
**Support**: `/alfred:1-plan`
|
|
219
|
+
**Support**: Use `/alfred:1-plan` command for guided SPEC creation
|
|
@@ -147,9 +147,9 @@ else
|
|
|
147
147
|
echo "⚠️ (none found)"
|
|
148
148
|
fi
|
|
149
149
|
|
|
150
|
-
echo -n "
|
|
151
|
-
if rg "^\*\*
|
|
152
|
-
COUNT=$(rg "^\*\*
|
|
150
|
+
echo -n " Unwanted Behaviors (UB-XXX)... "
|
|
151
|
+
if rg "^\*\*UB-\d+" "$SPEC_DIR/spec.md" > /dev/null 2>&1; then
|
|
152
|
+
COUNT=$(rg "^\*\*UB-\d+" "$SPEC_DIR/spec.md" | wc -l | tr -d ' ')
|
|
153
153
|
echo "✅ ($COUNT found)"
|
|
154
154
|
else
|
|
155
155
|
echo "⚠️ (none found)"
|