@ryuenn3123/agentic-senior-core 2.5.22 → 3.0.0
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/.agent-context/prompts/init-project.md +5 -5
- package/.agent-context/prompts/refactor.md +2 -1
- package/.agent-context/prompts/review-code.md +3 -2
- package/.agent-context/review-checklists/pr-checklist.md +8 -1
- package/.agent-context/rules/architecture.md +11 -0
- package/.agent-context/rules/frontend-architecture.md +2 -2
- package/.agent-context/state/architecture-map.md +1 -1
- package/.agent-context/state/memory-continuity-benchmark.json +1 -1
- package/.agents/workflows/init-project.md +3 -3
- package/.agents/workflows/refactor.md +1 -1
- package/.agents/workflows/review-code.md +4 -5
- package/.cursorrules +27 -71
- package/.gemini/instructions.md +6 -7
- package/.github/copilot-instructions.md +5 -6
- package/.windsurfrules +27 -71
- package/AGENTS.md +7 -9
- package/CONTRIBUTING.md +18 -31
- package/README.md +21 -4
- package/bin/agentic-senior-core.js +0 -6
- package/lib/cli/commands/init.mjs +113 -650
- package/lib/cli/commands/launch.mjs +1 -23
- package/lib/cli/commands/rollback.mjs +1 -1
- package/lib/cli/commands/upgrade.mjs +1 -23
- package/lib/cli/compiler.mjs +77 -72
- package/lib/cli/constants.mjs +84 -26
- package/lib/cli/init-architecture-flow.mjs +231 -0
- package/lib/cli/init-detection-flow.mjs +123 -0
- package/lib/cli/init-options.mjs +344 -0
- package/lib/cli/init-selection.mjs +100 -0
- package/lib/cli/preflight.mjs +1 -1
- package/lib/cli/profile-packs.mjs +15 -1
- package/lib/cli/project-scaffolder.mjs +18 -154
- package/lib/cli/utils.mjs +16 -12
- package/mcp.json +19 -19
- package/package.json +5 -2
- package/scripts/context-triggered-audit.mjs +18 -18
- package/scripts/documentation-boundary-audit.mjs +92 -5
- package/scripts/forbidden-content-check.mjs +1 -1
- package/scripts/frontend-usability-audit.mjs +21 -28
- package/scripts/governance-weekly-report.mjs +29 -15
- package/scripts/llm-judge.mjs +2 -5
- package/scripts/mcp-server.mjs +389 -5
- package/scripts/release-gate.mjs +121 -145
- package/scripts/sync-thin-adapters.mjs +161 -0
- package/scripts/v3-purge-audit.mjs +231 -0
- package/scripts/validate-evidence-bundle.mjs +1 -1
- package/scripts/validate.mjs +224 -272
- package/.agent-context/blueprints/api-nextjs.md +0 -184
- package/.agent-context/blueprints/aspnet-api.md +0 -247
- package/.agent-context/blueprints/ci-github-actions.md +0 -226
- package/.agent-context/blueprints/ci-gitlab.md +0 -200
- package/.agent-context/blueprints/fastapi-service.md +0 -210
- package/.agent-context/blueprints/go-service.md +0 -217
- package/.agent-context/blueprints/graphql-grpc-api.md +0 -51
- package/.agent-context/blueprints/infrastructure-as-code.md +0 -62
- package/.agent-context/blueprints/kubernetes-manifests.md +0 -76
- package/.agent-context/blueprints/laravel-api.md +0 -233
- package/.agent-context/blueprints/mobile-app.md +0 -91
- package/.agent-context/blueprints/nestjs-logic.md +0 -247
- package/.agent-context/blueprints/observability.md +0 -227
- package/.agent-context/blueprints/spring-boot-api.md +0 -218
- package/.agent-context/profiles/platform.md +0 -13
- package/.agent-context/profiles/regulated.md +0 -13
- package/.agent-context/profiles/startup.md +0 -13
- package/.agent-context/review-checklists/frontend-excellence-rubric.md +0 -73
- package/.agent-context/review-checklists/frontend-skill-parity.md +0 -29
- package/.agent-context/review-checklists/frontend-usability.md +0 -35
- package/.agent-context/review-checklists/marketplace-acceptance.md +0 -60
- package/.agent-context/review-checklists/performance-audit.md +0 -71
- package/.agent-context/review-checklists/release-operations.md +0 -33
- package/.agent-context/review-checklists/security-audit.md +0 -119
- package/.agent-context/skills/README.md +0 -63
- package/.agent-context/skills/backend/README.md +0 -68
- package/.agent-context/skills/backend/architecture.md +0 -361
- package/.agent-context/skills/backend/compatibility-manifest.json +0 -8
- package/.agent-context/skills/backend/data-access.md +0 -231
- package/.agent-context/skills/backend/errors.md +0 -138
- package/.agent-context/skills/backend/validation.md +0 -117
- package/.agent-context/skills/backend.md +0 -29
- package/.agent-context/skills/cli/.evidence/compatibility-manifest.json +0 -5
- package/.agent-context/skills/cli/.evidence/sbom-excerpt.json +0 -10
- package/.agent-context/skills/cli/.evidence/test-report.json +0 -8
- package/.agent-context/skills/cli/CHANGELOG.md +0 -6
- package/.agent-context/skills/cli/README.md +0 -56
- package/.agent-context/skills/cli/compatibility-manifest.json +0 -8
- package/.agent-context/skills/cli/init.md +0 -38
- package/.agent-context/skills/cli/output.md +0 -36
- package/.agent-context/skills/cli/package.json +0 -5
- package/.agent-context/skills/cli/safety-telemetry.md +0 -39
- package/.agent-context/skills/cli/tests/.gitkeep +0 -1
- package/.agent-context/skills/cli/upgrade.md +0 -38
- package/.agent-context/skills/cli.md +0 -32
- package/.agent-context/skills/distribution/.evidence/compatibility-manifest.json +0 -9
- package/.agent-context/skills/distribution/.evidence/sbom-excerpt.json +0 -6
- package/.agent-context/skills/distribution/.evidence/test-report.json +0 -8
- package/.agent-context/skills/distribution/CHANGELOG.md +0 -7
- package/.agent-context/skills/distribution/README.md +0 -27
- package/.agent-context/skills/distribution/compatibility-manifest.json +0 -8
- package/.agent-context/skills/distribution/compatibility.md +0 -32
- package/.agent-context/skills/distribution/package.json +0 -5
- package/.agent-context/skills/distribution/provenance-attestation.md +0 -47
- package/.agent-context/skills/distribution/publish.md +0 -37
- package/.agent-context/skills/distribution/rollback.md +0 -32
- package/.agent-context/skills/distribution/tests/.gitkeep +0 -1
- package/.agent-context/skills/distribution.md +0 -32
- package/.agent-context/skills/frontend/.evidence/compatibility-manifest.json +0 -9
- package/.agent-context/skills/frontend/.evidence/sbom-excerpt.json +0 -6
- package/.agent-context/skills/frontend/.evidence/test-report.json +0 -8
- package/.agent-context/skills/frontend/CHANGELOG.md +0 -7
- package/.agent-context/skills/frontend/README.md +0 -50
- package/.agent-context/skills/frontend/accessibility.md +0 -107
- package/.agent-context/skills/frontend/compatibility-manifest.json +0 -8
- package/.agent-context/skills/frontend/conversion-clarity.md +0 -51
- package/.agent-context/skills/frontend/motion.md +0 -67
- package/.agent-context/skills/frontend/package.json +0 -5
- package/.agent-context/skills/frontend/performance.md +0 -63
- package/.agent-context/skills/frontend/responsive-delivery.md +0 -41
- package/.agent-context/skills/frontend/tests/.gitkeep +0 -1
- package/.agent-context/skills/frontend/ui-architecture.md +0 -128
- package/.agent-context/skills/frontend.md +0 -40
- package/.agent-context/skills/fullstack/.evidence/compatibility-manifest.json +0 -9
- package/.agent-context/skills/fullstack/.evidence/sbom-excerpt.json +0 -6
- package/.agent-context/skills/fullstack/.evidence/test-report.json +0 -8
- package/.agent-context/skills/fullstack/CHANGELOG.md +0 -7
- package/.agent-context/skills/fullstack/README.md +0 -27
- package/.agent-context/skills/fullstack/compatibility-manifest.json +0 -8
- package/.agent-context/skills/fullstack/contracts.md +0 -53
- package/.agent-context/skills/fullstack/end-to-end.md +0 -42
- package/.agent-context/skills/fullstack/feature-slicing.md +0 -65
- package/.agent-context/skills/fullstack/package.json +0 -5
- package/.agent-context/skills/fullstack/release-coordination.md +0 -51
- package/.agent-context/skills/fullstack/tests/.gitkeep +0 -1
- package/.agent-context/skills/fullstack.md +0 -30
- package/.agent-context/skills/index.json +0 -107
- package/.agent-context/skills/review-quality/.evidence/compatibility-manifest.json +0 -9
- package/.agent-context/skills/review-quality/.evidence/sbom-excerpt.json +0 -6
- package/.agent-context/skills/review-quality/.evidence/test-report.json +0 -8
- package/.agent-context/skills/review-quality/CHANGELOG.md +0 -7
- package/.agent-context/skills/review-quality/README.md +0 -27
- package/.agent-context/skills/review-quality/benchmark.md +0 -30
- package/.agent-context/skills/review-quality/compatibility-manifest.json +0 -8
- package/.agent-context/skills/review-quality/package.json +0 -5
- package/.agent-context/skills/review-quality/planning.md +0 -38
- package/.agent-context/skills/review-quality/release-decision.md +0 -49
- package/.agent-context/skills/review-quality/security.md +0 -34
- package/.agent-context/skills/review-quality/tests/.gitkeep +0 -1
- package/.agent-context/skills/review-quality.md +0 -34
- package/.agent-context/stacks/csharp.md +0 -149
- package/.agent-context/stacks/flutter.md +0 -16
- package/.agent-context/stacks/go.md +0 -181
- package/.agent-context/stacks/java.md +0 -135
- package/.agent-context/stacks/php.md +0 -192
- package/.agent-context/stacks/python.md +0 -153
- package/.agent-context/stacks/react-native.md +0 -16
- package/.agent-context/stacks/ruby.md +0 -80
- package/.agent-context/stacks/rust.md +0 -86
- package/.agent-context/stacks/typescript.md +0 -317
- package/.agent-context/state/skill-platform.json +0 -38
- package/lib/cli/skill-selector.mjs +0 -232
- package/lib/cli/templates/api-contract.md.id.tmpl +0 -143
- package/lib/cli/templates/api-contract.md.tmpl +0 -143
- package/lib/cli/templates/architecture-decision-record.md.id.tmpl +0 -106
- package/lib/cli/templates/architecture-decision-record.md.tmpl +0 -145
- package/lib/cli/templates/database-schema.md.id.tmpl +0 -74
- package/lib/cli/templates/database-schema.md.tmpl +0 -74
- package/lib/cli/templates/flow-overview.md.id.tmpl +0 -118
- package/lib/cli/templates/flow-overview.md.tmpl +0 -131
- package/lib/cli/templates/project-brief.md.id.tmpl +0 -55
- package/lib/cli/templates/project-brief.md.tmpl +0 -79
- package/scripts/init-project.ps1 +0 -105
- package/scripts/init-project.sh +0 -131
- package/scripts/skill-tier-policy.mjs +0 -76
- package/scripts/trust-scorer.mjs +0 -119
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
# Ikhtisar Flow: {{projectName}}
|
|
2
|
-
|
|
3
|
-
Dibuat oleh Agentic-Senior-Core CLI v{{cliVersion}}
|
|
4
|
-
Dibuat pada: {{generatedAt}}
|
|
5
|
-
Versi template: {{templateVersion}}
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## Ikhtisar Sistem
|
|
10
|
-
|
|
11
|
-
**Proyek**: {{projectName}}
|
|
12
|
-
**Domain**: {{primaryDomain}}
|
|
13
|
-
**Stack**: {{stackDisplayName}}
|
|
14
|
-
**Blueprint**: {{blueprintDisplayName}}
|
|
15
|
-
|
|
16
|
-
## Arsitektur Tingkat Tinggi
|
|
17
|
-
|
|
18
|
-
```
|
|
19
|
-
+-------------+ +--------------+ +--------------+
|
|
20
|
-
| Client |---->| Transport |---->| Service |
|
|
21
|
-
| (Browser/ |<----| Layer |<----| Layer |
|
|
22
|
-
| Mobile/CLI) | | (Routes/ | | (Business |
|
|
23
|
-
| | | Handlers) | | Logic) |
|
|
24
|
-
+-------------+ +--------------+ +------+-------+
|
|
25
|
-
|
|
|
26
|
-
+------+-------+
|
|
27
|
-
| Repository |
|
|
28
|
-
| Layer |
|
|
29
|
-
| (Data Access)|
|
|
30
|
-
+------+-------+
|
|
31
|
-
|
|
|
32
|
-
+------+-------+
|
|
33
|
-
| Database |
|
|
34
|
-
| {{databaseChoice}} |
|
|
35
|
-
+--------------+
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
## Flow Request
|
|
39
|
-
|
|
40
|
-
### Siklus Request Standar
|
|
41
|
-
|
|
42
|
-
1. **Client** mengirim HTTP request (atau input CLI, atau event trigger).
|
|
43
|
-
2. **Transport layer** menerima request, memvalidasi format input, lalu routing ke handler yang tepat.
|
|
44
|
-
3. **Service layer** menerapkan business logic, orkestrasi operasi domain, dan enforcement aturan.
|
|
45
|
-
4. **Repository layer** melakukan akses data (read/write ke database atau layanan eksternal).
|
|
46
|
-
5. **Response** kembali dari Service ke Transport lalu ke Client.
|
|
47
|
-
|
|
48
|
-
### Tanggung Jawab Layer
|
|
49
|
-
|
|
50
|
-
| Layer | Melakukan | Tidak melakukan |
|
|
51
|
-
|-------|-----------|-----------------|
|
|
52
|
-
| Transport | Parse input, validasi shape, routing, format response | Business logic, akses database |
|
|
53
|
-
| Service | Business rules, orkestrasi, validasi domain | Parse HTTP, format response, menjalankan SQL |
|
|
54
|
-
| Repository | Akses data, query, caching | Business logic, validasi input |
|
|
55
|
-
|
|
56
|
-
{{#if hasAuth}}
|
|
57
|
-
## Flow Autentikasi
|
|
58
|
-
|
|
59
|
-
```
|
|
60
|
-
+--------+ +-----------+ +-----------+ +-----------+
|
|
61
|
-
| Client |---->| Auth |---->| Token |---->| Protected |
|
|
62
|
-
| | | Endpoint | | Verify | | Resource |
|
|
63
|
-
| |<----| |<----| ({{authStrategy}}) |<----| |
|
|
64
|
-
+--------+ +-----------+ +-----------+ +-----------+
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
1. Client mengirim kredensial ke endpoint auth.
|
|
68
|
-
2. Service memvalidasi kredensial terhadap data tersimpan.
|
|
69
|
-
3. Jika sukses, service mengeluarkan token {{authStrategy}}.
|
|
70
|
-
4. Client menyertakan token di request berikutnya.
|
|
71
|
-
5. Middleware memverifikasi token sebelum request diteruskan ke handler terproteksi.
|
|
72
|
-
|
|
73
|
-
{{/if}}
|
|
74
|
-
## Flow Fitur
|
|
75
|
-
|
|
76
|
-
Untuk setiap fitur kunci, definisikan flow data dan kontrol:
|
|
77
|
-
|
|
78
|
-
{{#each features}}
|
|
79
|
-
### {{this}}
|
|
80
|
-
|
|
81
|
-
**Aktor**: [siapa yang memulai flow ini]
|
|
82
|
-
**Trigger**: [apa yang memulai flow ini]
|
|
83
|
-
**Langkah**:
|
|
84
|
-
1. [Langkah 1]
|
|
85
|
-
2. [Langkah 2]
|
|
86
|
-
3. [Langkah 3]
|
|
87
|
-
|
|
88
|
-
**Hasil sukses**: [apa yang terjadi saat flow selesai]
|
|
89
|
-
**Penanganan error**: [apa yang terjadi jika gagal]
|
|
90
|
-
|
|
91
|
-
---
|
|
92
|
-
|
|
93
|
-
{{/each}}
|
|
94
|
-
|
|
95
|
-
## Diagram Aliran Data
|
|
96
|
-
|
|
97
|
-
```
|
|
98
|
-
Input Data Proses Output
|
|
99
|
-
---------- ----------- ----------
|
|
100
|
-
+--------------------+
|
|
101
|
-
User Input ----->| Validation |
|
|
102
|
-
| (Transport) |
|
|
103
|
-
+---------+----------+
|
|
104
|
-
|
|
|
105
|
-
+---------v----------+
|
|
106
|
-
| Business Logic |
|
|
107
|
-
| (Service) |
|
|
108
|
-
+---------+----------+
|
|
109
|
-
|
|
|
110
|
-
+---------v----------+
|
|
111
|
-
| Data Persist |-------> Stored Data
|
|
112
|
-
| (Repository) |
|
|
113
|
-
+--------------------+
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
---
|
|
117
|
-
|
|
118
|
-
Dokumen ini adalah referensi hidup. Perbarui flow saat fitur diimplementasikan dan disempurnakan.
|
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
# Flow Overview: {{projectName}}
|
|
2
|
-
|
|
3
|
-
Generated by Agentic-Senior-Core CLI v{{cliVersion}}
|
|
4
|
-
Generated at: {{generatedAt}}
|
|
5
|
-
Template version: {{templateVersion}}
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## System Overview
|
|
10
|
-
|
|
11
|
-
**Project**: {{projectName}}
|
|
12
|
-
**Domain**: {{primaryDomain}}
|
|
13
|
-
**Stack**: {{stackDisplayName}}
|
|
14
|
-
**Blueprint**: {{blueprintDisplayName}}
|
|
15
|
-
**Runtime target**: {{runtimeEnvironmentLabel}}
|
|
16
|
-
**Containerization**: {{dockerStrategy}}
|
|
17
|
-
|
|
18
|
-
{{#if hasDocker}}
|
|
19
|
-
## Container Flow (Dynamic Dev and Prod)
|
|
20
|
-
|
|
21
|
-
- Container setup is generated dynamically by AI from current dependencies, not from static canned templates.
|
|
22
|
-
{{dockerDevelopmentGuidance}}
|
|
23
|
-
{{dockerProductionGuidance}}
|
|
24
|
-
- Keep dev and prod container concerns explicitly separated.
|
|
25
|
-
|
|
26
|
-
{{/if}}
|
|
27
|
-
|
|
28
|
-
## High-Level Architecture
|
|
29
|
-
|
|
30
|
-
```
|
|
31
|
-
┌─────────────┐ ┌──────────────┐ ┌──────────────┐
|
|
32
|
-
│ Client │────>│ Transport │────>│ Service │
|
|
33
|
-
│ (Browser/ │<────│ Layer │<────│ Layer │
|
|
34
|
-
│ Mobile/ │ │ (Routes/ │ │ (Business │
|
|
35
|
-
│ CLI) │ │ Handlers) │ │ Logic) │
|
|
36
|
-
└─────────────┘ └──────────────┘ └──────┬───────┘
|
|
37
|
-
│
|
|
38
|
-
┌──────▼───────┐
|
|
39
|
-
│ Repository │
|
|
40
|
-
│ Layer │
|
|
41
|
-
│ (Data │
|
|
42
|
-
│ Access) │
|
|
43
|
-
└──────┬───────┘
|
|
44
|
-
│
|
|
45
|
-
┌──────▼───────┐
|
|
46
|
-
│ Database │
|
|
47
|
-
│ {{databaseChoice}}
|
|
48
|
-
└──────────────┘
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
## Request Flow
|
|
52
|
-
|
|
53
|
-
### Standard Request Lifecycle
|
|
54
|
-
|
|
55
|
-
1. **Client** sends HTTP request (or CLI input, or event trigger).
|
|
56
|
-
2. **Transport layer** receives the request, validates input format, and routes to the correct handler.
|
|
57
|
-
3. **Service layer** applies business logic, orchestrates domain operations, and enforces rules.
|
|
58
|
-
4. **Repository layer** performs data access (read/write to database or external service).
|
|
59
|
-
5. **Response** flows back through Service to Transport to Client.
|
|
60
|
-
|
|
61
|
-
### Layer Responsibilities
|
|
62
|
-
|
|
63
|
-
| Layer | Does | Does NOT |
|
|
64
|
-
|-------|------|----------|
|
|
65
|
-
| Transport | Parse input, validate shape, route, format response | Contain business logic, access database |
|
|
66
|
-
| Service | Business rules, orchestration, domain validation | Parse HTTP, format responses, run SQL |
|
|
67
|
-
| Repository | Data access, query construction, caching | Business logic, input validation |
|
|
68
|
-
|
|
69
|
-
{{#if hasAuth}}
|
|
70
|
-
## Authentication Flow
|
|
71
|
-
|
|
72
|
-
```
|
|
73
|
-
┌────────┐ ┌───────────┐ ┌──────────┐ ┌──────────┐
|
|
74
|
-
│ Client │────>│ Auth │────>│ Token │────>│ Protected│
|
|
75
|
-
│ │ │ Endpoint │ │ Verify │ │ Resource │
|
|
76
|
-
│ │<────│ │<────│ ({{authStrategy}}) │<────│ │
|
|
77
|
-
└────────┘ └───────────┘ └──────────┘ └──────────┘
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
1. Client sends credentials to auth endpoint.
|
|
81
|
-
2. Service validates credentials against stored data.
|
|
82
|
-
3. On success, service issues a {{authStrategy}} token.
|
|
83
|
-
4. Client includes token in subsequent requests.
|
|
84
|
-
5. Middleware verifies token before forwarding to protected handlers.
|
|
85
|
-
|
|
86
|
-
{{/if}}
|
|
87
|
-
## Feature Flows
|
|
88
|
-
|
|
89
|
-
For each key feature, define the data and control flow:
|
|
90
|
-
|
|
91
|
-
{{#each features}}
|
|
92
|
-
### {{this}}
|
|
93
|
-
|
|
94
|
-
**Actors**: [define who initiates this flow]
|
|
95
|
-
**Trigger**: [define what starts this flow]
|
|
96
|
-
**Steps**:
|
|
97
|
-
1. [Step 1]
|
|
98
|
-
2. [Step 2]
|
|
99
|
-
3. [Step 3]
|
|
100
|
-
|
|
101
|
-
**Success outcome**: [what happens when the flow completes]
|
|
102
|
-
**Error handling**: [what happens on failure]
|
|
103
|
-
|
|
104
|
-
---
|
|
105
|
-
|
|
106
|
-
{{/each}}
|
|
107
|
-
|
|
108
|
-
## Data Flow Diagram
|
|
109
|
-
|
|
110
|
-
```
|
|
111
|
-
Input Data Processing Output
|
|
112
|
-
────────── ────────── ──────────
|
|
113
|
-
┌───────────────────┐
|
|
114
|
-
User Input ──────>│ Validation │
|
|
115
|
-
│ (Transport) │
|
|
116
|
-
└────────┬──────────┘
|
|
117
|
-
│
|
|
118
|
-
┌────────▼──────────┐
|
|
119
|
-
│ Business Logic │
|
|
120
|
-
│ (Service) │
|
|
121
|
-
└────────┬──────────┘
|
|
122
|
-
│
|
|
123
|
-
┌────────▼──────────┐
|
|
124
|
-
│ Data Persist │───────> Stored Data
|
|
125
|
-
│ (Repository) │
|
|
126
|
-
└───────────────────┘
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
---
|
|
130
|
-
|
|
131
|
-
This document is a living reference. Update flows as features are implemented and refined.
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
# Ringkasan Proyek: {{projectName}}
|
|
2
|
-
|
|
3
|
-
Dibuat oleh Agentic-Senior-Core CLI v{{cliVersion}}
|
|
4
|
-
Dibuat pada: {{generatedAt}}
|
|
5
|
-
Versi template: {{templateVersion}}
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## Ikhtisar
|
|
10
|
-
|
|
11
|
-
**Nama proyek**: {{projectName}}
|
|
12
|
-
**Deskripsi**: {{projectDescription}}
|
|
13
|
-
**Domain utama**: {{primaryDomain}}
|
|
14
|
-
|
|
15
|
-
## Keputusan Teknologi
|
|
16
|
-
|
|
17
|
-
**Stack**: {{stackDisplayName}}
|
|
18
|
-
**Blueprint**: {{blueprintDisplayName}}
|
|
19
|
-
**Database**: {{databaseChoice}}
|
|
20
|
-
**Strategi autentikasi**: {{authStrategy}}
|
|
21
|
-
**Target environment runtime**: {{runtimeEnvironmentLabel}}
|
|
22
|
-
**Strategi containerisasi**: {{dockerStrategy}}
|
|
23
|
-
|
|
24
|
-
## Fitur Kunci
|
|
25
|
-
|
|
26
|
-
{{#each features}}
|
|
27
|
-
- {{this}}
|
|
28
|
-
{{/each}}
|
|
29
|
-
|
|
30
|
-
## Konteks Tambahan
|
|
31
|
-
|
|
32
|
-
{{additionalContext}}
|
|
33
|
-
|
|
34
|
-
## Batasan dan Asumsi
|
|
35
|
-
|
|
36
|
-
- Proyek ini mengikuti aturan governance di `.agent-context/rules/`.
|
|
37
|
-
- Konvensi stack mengacu ke `.agent-context/stacks/{{stackFileName}}`.
|
|
38
|
-
- Pola arsitektur mengacu ke `.agent-context/blueprints/{{blueprintFileName}}`.
|
|
39
|
-
- Semua kode harus lolos checklist di `.agent-context/review-checklists/pr-checklist.md`.
|
|
40
|
-
|
|
41
|
-
## Tujuan
|
|
42
|
-
|
|
43
|
-
1. Mengirimkan {{primaryDomain}} yang berjalan dengan stack {{stackDisplayName}}.
|
|
44
|
-
2. Menjaga standar engineering production-grade sejak awal.
|
|
45
|
-
3. Menjaga keputusan arsitektur tetap terdokumentasi dan bisa ditelusuri.
|
|
46
|
-
|
|
47
|
-
## Non-Tujuan (Ruang Lingkup Awal)
|
|
48
|
-
|
|
49
|
-
- Optimasi performa di luar baseline yang wajar.
|
|
50
|
-
- Deployment multi-region.
|
|
51
|
-
- Analitik atau pelaporan tingkat lanjut.
|
|
52
|
-
|
|
53
|
-
---
|
|
54
|
-
|
|
55
|
-
Dokumen ini adalah referensi hidup. Perbarui saat ruang lingkup proyek berkembang.
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
# Project Brief: {{projectName}}
|
|
2
|
-
|
|
3
|
-
Generated by Agentic-Senior-Core CLI v{{cliVersion}}
|
|
4
|
-
Generated at: {{generatedAt}}
|
|
5
|
-
Template version: {{templateVersion}}
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## Overview
|
|
10
|
-
|
|
11
|
-
**Project name**: {{projectName}}
|
|
12
|
-
**Description**: {{projectDescription}}
|
|
13
|
-
**Primary domain**: {{primaryDomain}}
|
|
14
|
-
|
|
15
|
-
## Technology Decisions
|
|
16
|
-
|
|
17
|
-
**Stack**: {{stackDisplayName}}
|
|
18
|
-
{{#if additionalStackDisplayNames}}
|
|
19
|
-
**Additional stacks**:
|
|
20
|
-
{{#each additionalStackDisplayNames}}
|
|
21
|
-
- {{this}}
|
|
22
|
-
{{/each}}
|
|
23
|
-
{{/if}}
|
|
24
|
-
**Blueprint**: {{blueprintDisplayName}}
|
|
25
|
-
{{#if additionalBlueprintDisplayNames}}
|
|
26
|
-
**Additional blueprints**:
|
|
27
|
-
{{#each additionalBlueprintDisplayNames}}
|
|
28
|
-
- {{this}}
|
|
29
|
-
{{/each}}
|
|
30
|
-
{{/if}}
|
|
31
|
-
**Database**: {{databaseChoice}}
|
|
32
|
-
**Auth strategy**: {{authStrategy}}
|
|
33
|
-
**Runtime environment target**: {{runtimeEnvironmentLabel}}
|
|
34
|
-
**Containerization strategy**: {{dockerStrategy}}
|
|
35
|
-
|
|
36
|
-
{{#if hasDocker}}
|
|
37
|
-
## Containerization Workflow (Dynamic)
|
|
38
|
-
|
|
39
|
-
- Docker is enabled for this project: **{{dockerStrategy}}**.
|
|
40
|
-
- Docker setup must be generated dynamically by AI based on current dependencies and runtime constraints.
|
|
41
|
-
- Do not use fixed boilerplate templates that ignore actual project structure.
|
|
42
|
-
{{dockerDevelopmentGuidance}}
|
|
43
|
-
{{dockerProductionGuidance}}
|
|
44
|
-
|
|
45
|
-
- Keep development and production container strategy separated to avoid environment drift.
|
|
46
|
-
{{/if}}
|
|
47
|
-
|
|
48
|
-
## Key Features
|
|
49
|
-
|
|
50
|
-
{{#each features}}
|
|
51
|
-
- {{this}}
|
|
52
|
-
{{/each}}
|
|
53
|
-
|
|
54
|
-
## Additional Context
|
|
55
|
-
|
|
56
|
-
{{additionalContext}}
|
|
57
|
-
|
|
58
|
-
## Constraints and Assumptions
|
|
59
|
-
|
|
60
|
-
- This project follows the governance rules defined in `.agent-context/rules/`.
|
|
61
|
-
- Stack conventions are defined in `.agent-context/stacks/{{stackFileName}}`.
|
|
62
|
-
- Architecture patterns follow `.agent-context/blueprints/{{blueprintFileName}}`.
|
|
63
|
-
- All code must pass the review checklist at `.agent-context/review-checklists/pr-checklist.md`.
|
|
64
|
-
|
|
65
|
-
## Goals
|
|
66
|
-
|
|
67
|
-
1. Deliver a working {{primaryDomain}} using the {{stackDisplayName}} stack.
|
|
68
|
-
2. Follow production-grade engineering standards from day one.
|
|
69
|
-
3. Keep architecture decisions documented and traceable.
|
|
70
|
-
|
|
71
|
-
## Non-Goals (Initial Scope)
|
|
72
|
-
|
|
73
|
-
- Performance optimization beyond sensible defaults.
|
|
74
|
-
- Multi-region deployment.
|
|
75
|
-
- Advanced analytics or reporting.
|
|
76
|
-
|
|
77
|
-
---
|
|
78
|
-
|
|
79
|
-
This document is a living reference. Update it as the project scope evolves.
|
package/scripts/init-project.ps1
DELETED
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env pwsh
|
|
2
|
-
|
|
3
|
-
[CmdletBinding()]
|
|
4
|
-
param(
|
|
5
|
-
[string]$TargetDirectory = ".",
|
|
6
|
-
[ValidateSet("beginner", "balanced", "strict")]
|
|
7
|
-
[string]$Profile,
|
|
8
|
-
[string]$Stack,
|
|
9
|
-
[string]$Blueprint,
|
|
10
|
-
[ValidateSet("true", "false")]
|
|
11
|
-
[string]$Ci,
|
|
12
|
-
[switch]$Newbie,
|
|
13
|
-
[string]$RepositoryUrl = "https://github.com/fatidaprilian/Agentic-Senior-Core.git",
|
|
14
|
-
[string[]]$AdditionalArguments
|
|
15
|
-
)
|
|
16
|
-
|
|
17
|
-
$ErrorActionPreference = "Stop"
|
|
18
|
-
|
|
19
|
-
function Resolve-AbsolutePath {
|
|
20
|
-
param([string]$PathValue)
|
|
21
|
-
|
|
22
|
-
if ([string]::IsNullOrWhiteSpace($PathValue)) {
|
|
23
|
-
throw "TargetDirectory cannot be empty."
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
if ([System.IO.Path]::IsPathRooted($PathValue)) {
|
|
27
|
-
return [System.IO.Path]::GetFullPath($PathValue)
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
$combinedPath = Join-Path -Path (Get-Location) -ChildPath $PathValue
|
|
31
|
-
return [System.IO.Path]::GetFullPath($combinedPath)
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
function New-TemporaryDirectory {
|
|
35
|
-
$temporaryDirectoryName = "agentic-senior-core-bootstrap-$(Get-Date -Format 'yyyyMMddHHmmssfff')"
|
|
36
|
-
$temporaryDirectoryPath = Join-Path -Path ([System.IO.Path]::GetTempPath()) -ChildPath $temporaryDirectoryName
|
|
37
|
-
New-Item -ItemType Directory -Path $temporaryDirectoryPath | Out-Null
|
|
38
|
-
return $temporaryDirectoryPath
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
$targetDirectoryPath = Resolve-AbsolutePath -PathValue $TargetDirectory
|
|
42
|
-
if (-not (Test-Path -Path $targetDirectoryPath -PathType Container)) {
|
|
43
|
-
throw "Target directory does not exist: $targetDirectoryPath"
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
$temporaryRootDirectoryPath = New-TemporaryDirectory
|
|
47
|
-
$bootstrapRepositoryPath = Join-Path -Path $temporaryRootDirectoryPath -ChildPath "Agentic-Senior-Core"
|
|
48
|
-
|
|
49
|
-
try {
|
|
50
|
-
if (-not (Get-Command git -ErrorAction SilentlyContinue)) {
|
|
51
|
-
throw "Git is required but was not found in PATH."
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
if (-not (Get-Command node -ErrorAction SilentlyContinue)) {
|
|
55
|
-
throw "Node.js is required but was not found in PATH."
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
Write-Host "[Agentic-Senior-Core] Cloning bootstrap repository into temporary directory..."
|
|
59
|
-
& git clone --depth 1 $RepositoryUrl $bootstrapRepositoryPath | Out-Null
|
|
60
|
-
if ($LASTEXITCODE -ne 0) {
|
|
61
|
-
throw "Failed to clone repository from $RepositoryUrl"
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
$cliScriptPath = Join-Path -Path $bootstrapRepositoryPath -ChildPath "bin\agentic-senior-core.js"
|
|
65
|
-
if (-not (Test-Path -Path $cliScriptPath -PathType Leaf)) {
|
|
66
|
-
throw "CLI entry file not found: $cliScriptPath"
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
$cliArguments = @($cliScriptPath, "init", $targetDirectoryPath)
|
|
70
|
-
|
|
71
|
-
if ($Profile) {
|
|
72
|
-
$cliArguments += @("--profile", $Profile)
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
if ($Stack) {
|
|
76
|
-
$cliArguments += @("--stack", $Stack)
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
if ($Blueprint) {
|
|
80
|
-
$cliArguments += @("--blueprint", $Blueprint)
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
if ($Ci) {
|
|
84
|
-
$cliArguments += @("--ci", $Ci)
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
if ($Newbie.IsPresent) {
|
|
88
|
-
$cliArguments += "--newbie"
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
if ($AdditionalArguments) {
|
|
92
|
-
$cliArguments += $AdditionalArguments
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
Write-Host "[Agentic-Senior-Core] Running CLI against target directory: $targetDirectoryPath"
|
|
96
|
-
& node @cliArguments
|
|
97
|
-
if ($LASTEXITCODE -ne 0) {
|
|
98
|
-
throw "CLI exited with a non-zero status code: $LASTEXITCODE"
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
finally {
|
|
102
|
-
if (Test-Path -Path $temporaryRootDirectoryPath) {
|
|
103
|
-
Remove-Item -Path $temporaryRootDirectoryPath -Recurse -Force
|
|
104
|
-
}
|
|
105
|
-
}
|
package/scripts/init-project.sh
DELETED
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
|
|
3
|
-
set -euo pipefail
|
|
4
|
-
|
|
5
|
-
TARGET_DIRECTORY="."
|
|
6
|
-
PROFILE=""
|
|
7
|
-
STACK=""
|
|
8
|
-
BLUEPRINT=""
|
|
9
|
-
CI_VALUE=""
|
|
10
|
-
ENABLE_NEWBIE_MODE="false"
|
|
11
|
-
REPOSITORY_URL="https://github.com/fatidaprilian/Agentic-Senior-Core.git"
|
|
12
|
-
ADDITIONAL_ARGUMENTS=()
|
|
13
|
-
|
|
14
|
-
while (($# > 0)); do
|
|
15
|
-
case "$1" in
|
|
16
|
-
--profile)
|
|
17
|
-
PROFILE="${2:-}"
|
|
18
|
-
shift 2
|
|
19
|
-
;;
|
|
20
|
-
--profile=*)
|
|
21
|
-
PROFILE="${1#*=}"
|
|
22
|
-
shift
|
|
23
|
-
;;
|
|
24
|
-
--stack)
|
|
25
|
-
STACK="${2:-}"
|
|
26
|
-
shift 2
|
|
27
|
-
;;
|
|
28
|
-
--stack=*)
|
|
29
|
-
STACK="${1#*=}"
|
|
30
|
-
shift
|
|
31
|
-
;;
|
|
32
|
-
--blueprint)
|
|
33
|
-
BLUEPRINT="${2:-}"
|
|
34
|
-
shift 2
|
|
35
|
-
;;
|
|
36
|
-
--blueprint=*)
|
|
37
|
-
BLUEPRINT="${1#*=}"
|
|
38
|
-
shift
|
|
39
|
-
;;
|
|
40
|
-
--ci)
|
|
41
|
-
CI_VALUE="${2:-}"
|
|
42
|
-
shift 2
|
|
43
|
-
;;
|
|
44
|
-
--ci=*)
|
|
45
|
-
CI_VALUE="${1#*=}"
|
|
46
|
-
shift
|
|
47
|
-
;;
|
|
48
|
-
--newbie)
|
|
49
|
-
ENABLE_NEWBIE_MODE="true"
|
|
50
|
-
shift
|
|
51
|
-
;;
|
|
52
|
-
--repository-url)
|
|
53
|
-
REPOSITORY_URL="${2:-}"
|
|
54
|
-
shift 2
|
|
55
|
-
;;
|
|
56
|
-
--repository-url=*)
|
|
57
|
-
REPOSITORY_URL="${1#*=}"
|
|
58
|
-
shift
|
|
59
|
-
;;
|
|
60
|
-
--)
|
|
61
|
-
shift
|
|
62
|
-
ADDITIONAL_ARGUMENTS+=("$@")
|
|
63
|
-
break
|
|
64
|
-
;;
|
|
65
|
-
-* )
|
|
66
|
-
echo "Unknown option: $1" >&2
|
|
67
|
-
exit 1
|
|
68
|
-
;;
|
|
69
|
-
*)
|
|
70
|
-
TARGET_DIRECTORY="$1"
|
|
71
|
-
shift
|
|
72
|
-
;;
|
|
73
|
-
esac
|
|
74
|
-
done
|
|
75
|
-
|
|
76
|
-
if ! command -v git >/dev/null 2>&1; then
|
|
77
|
-
echo "Git is required but was not found in PATH." >&2
|
|
78
|
-
exit 1
|
|
79
|
-
fi
|
|
80
|
-
|
|
81
|
-
if ! command -v node >/dev/null 2>&1; then
|
|
82
|
-
echo "Node.js is required but was not found in PATH." >&2
|
|
83
|
-
exit 1
|
|
84
|
-
fi
|
|
85
|
-
|
|
86
|
-
RESOLVED_TARGET_DIRECTORY="$(cd "$TARGET_DIRECTORY" && pwd)"
|
|
87
|
-
TEMPORARY_ROOT_DIRECTORY="$(mktemp -d 2>/dev/null || mktemp -d -t agentic-senior-core-bootstrap)"
|
|
88
|
-
BOOTSTRAP_REPOSITORY_PATH="$TEMPORARY_ROOT_DIRECTORY/Agentic-Senior-Core"
|
|
89
|
-
|
|
90
|
-
cleanup_temporary_directory() {
|
|
91
|
-
rm -rf "$TEMPORARY_ROOT_DIRECTORY"
|
|
92
|
-
}
|
|
93
|
-
trap cleanup_temporary_directory EXIT
|
|
94
|
-
|
|
95
|
-
echo "[Agentic-Senior-Core] Cloning bootstrap repository into temporary directory..."
|
|
96
|
-
git clone --depth 1 "$REPOSITORY_URL" "$BOOTSTRAP_REPOSITORY_PATH" >/dev/null
|
|
97
|
-
|
|
98
|
-
CLI_SCRIPT_PATH="$BOOTSTRAP_REPOSITORY_PATH/bin/agentic-senior-core.js"
|
|
99
|
-
if [[ ! -f "$CLI_SCRIPT_PATH" ]]; then
|
|
100
|
-
echo "CLI entry file not found: $CLI_SCRIPT_PATH" >&2
|
|
101
|
-
exit 1
|
|
102
|
-
fi
|
|
103
|
-
|
|
104
|
-
CLI_ARGUMENTS=("$CLI_SCRIPT_PATH" init "$RESOLVED_TARGET_DIRECTORY")
|
|
105
|
-
|
|
106
|
-
if [[ -n "$PROFILE" ]]; then
|
|
107
|
-
CLI_ARGUMENTS+=(--profile "$PROFILE")
|
|
108
|
-
fi
|
|
109
|
-
|
|
110
|
-
if [[ -n "$STACK" ]]; then
|
|
111
|
-
CLI_ARGUMENTS+=(--stack "$STACK")
|
|
112
|
-
fi
|
|
113
|
-
|
|
114
|
-
if [[ -n "$BLUEPRINT" ]]; then
|
|
115
|
-
CLI_ARGUMENTS+=(--blueprint "$BLUEPRINT")
|
|
116
|
-
fi
|
|
117
|
-
|
|
118
|
-
if [[ -n "$CI_VALUE" ]]; then
|
|
119
|
-
CLI_ARGUMENTS+=(--ci "$CI_VALUE")
|
|
120
|
-
fi
|
|
121
|
-
|
|
122
|
-
if [[ "$ENABLE_NEWBIE_MODE" == "true" ]]; then
|
|
123
|
-
CLI_ARGUMENTS+=(--newbie)
|
|
124
|
-
fi
|
|
125
|
-
|
|
126
|
-
if ((${#ADDITIONAL_ARGUMENTS[@]} > 0)); then
|
|
127
|
-
CLI_ARGUMENTS+=("${ADDITIONAL_ARGUMENTS[@]}")
|
|
128
|
-
fi
|
|
129
|
-
|
|
130
|
-
echo "[Agentic-Senior-Core] Running CLI against target directory: $RESOLVED_TARGET_DIRECTORY"
|
|
131
|
-
node "${CLI_ARGUMENTS[@]}"
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
export const SKILL_TIER_MINIMUMS = {
|
|
2
|
-
standard: { minWords: 60, minHeadings: 1, minChecklistItems: 0, minCodeBlocks: 0 },
|
|
3
|
-
advance: { minWords: 100, minHeadings: 2, minChecklistItems: 1, minCodeBlocks: 0 },
|
|
4
|
-
expert: { minWords: 130, minHeadings: 3, minChecklistItems: 1, minCodeBlocks: 0 },
|
|
5
|
-
above: { minWords: 240, minHeadings: 3, minChecklistItems: 1, minCodeBlocks: 1 },
|
|
6
|
-
};
|
|
7
|
-
|
|
8
|
-
export function countWords(markdownContent) {
|
|
9
|
-
return markdownContent
|
|
10
|
-
.replace(/```[\s\S]*?```/g, ' ')
|
|
11
|
-
.replace(/[^A-Za-z0-9_\-\s]/g, ' ')
|
|
12
|
-
.trim()
|
|
13
|
-
.split(/\s+/)
|
|
14
|
-
.filter(Boolean).length;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export function countMarkdownHeadings(markdownContent) {
|
|
18
|
-
const headingMatches = markdownContent.match(/^#{2,6}\s+/gm);
|
|
19
|
-
return headingMatches ? headingMatches.length : 0;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export function countChecklistItems(markdownContent) {
|
|
23
|
-
const checklistMatches = markdownContent.match(/^\s*[-*]\s+\[[ xX]\]\s+/gm);
|
|
24
|
-
return checklistMatches ? checklistMatches.length : 0;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export function countCodeBlocks(markdownContent) {
|
|
28
|
-
const fenceMatches = markdownContent.match(/```/g);
|
|
29
|
-
if (!fenceMatches) {
|
|
30
|
-
return 0;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
return Math.floor(fenceMatches.length / 2);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export function extractSkillTier(markdownContent) {
|
|
37
|
-
const normalizedMarkdownContent = markdownContent.replace(/\*\*/g, '');
|
|
38
|
-
const tierMatch = normalizedMarkdownContent.match(/\bTier\s*:\s*`?(standard|advance|expert|above)`?\b/i);
|
|
39
|
-
return tierMatch ? tierMatch[1].toLowerCase() : null;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export function validateSkillTopicContent(markdownContent) {
|
|
43
|
-
const detectedTier = extractSkillTier(markdownContent);
|
|
44
|
-
|
|
45
|
-
if (!detectedTier) {
|
|
46
|
-
return { isValid: false, reason: 'missing-tier' };
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
const minimumRules = SKILL_TIER_MINIMUMS[detectedTier];
|
|
50
|
-
if (!minimumRules) {
|
|
51
|
-
return { isValid: false, reason: 'unsupported-tier', detectedTier };
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
const wordCount = countWords(markdownContent);
|
|
55
|
-
const headingCount = countMarkdownHeadings(markdownContent);
|
|
56
|
-
const checklistCount = countChecklistItems(markdownContent);
|
|
57
|
-
const codeBlockCount = countCodeBlocks(markdownContent);
|
|
58
|
-
|
|
59
|
-
if (wordCount < minimumRules.minWords) {
|
|
60
|
-
return { isValid: false, reason: 'word-count', detectedTier, wordCount, minimumRules };
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
if (headingCount < minimumRules.minHeadings) {
|
|
64
|
-
return { isValid: false, reason: 'heading-count', detectedTier, headingCount, minimumRules };
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
if (checklistCount < minimumRules.minChecklistItems) {
|
|
68
|
-
return { isValid: false, reason: 'checklist-count', detectedTier, checklistCount, minimumRules };
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
if (codeBlockCount < minimumRules.minCodeBlocks) {
|
|
72
|
-
return { isValid: false, reason: 'code-block-count', detectedTier, codeBlockCount, minimumRules };
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
return { isValid: true, detectedTier, wordCount, headingCount, checklistCount, codeBlockCount, minimumRules };
|
|
76
|
-
}
|