@atlashub/smartstack-cli 1.37.0 → 2.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/config/mcp-defaults.json +62 -0
- package/dist/index.js +57 -4
- package/dist/index.js.map +1 -1
- package/dist/mcp-entry.mjs +16984 -0
- package/dist/mcp-entry.mjs.map +1 -0
- package/package.json +14 -5
- package/templates/agents/gitflow/start.md +5 -4
- package/templates/agents/mcp-healthcheck.md +15 -13
- package/templates/mcp-scaffolding/component.tsx.hbs +298 -0
- package/templates/mcp-scaffolding/controller.cs.hbs +184 -0
- package/templates/mcp-scaffolding/entity-extension.cs.hbs +231 -0
- package/templates/mcp-scaffolding/frontend/api-client.ts.hbs +116 -0
- package/templates/mcp-scaffolding/frontend/nav-routes.ts.hbs +133 -0
- package/templates/mcp-scaffolding/frontend/routes.tsx.hbs +134 -0
- package/templates/mcp-scaffolding/migrations/seed-roles.cs.hbs +261 -0
- package/templates/mcp-scaffolding/service-extension.cs.hbs +53 -0
- package/templates/mcp-scaffolding/tests/controller.test.cs.hbs +413 -0
- package/templates/mcp-scaffolding/tests/entity.test.cs.hbs +239 -0
- package/templates/mcp-scaffolding/tests/repository.test.cs.hbs +441 -0
- package/templates/mcp-scaffolding/tests/security.test.cs.hbs +442 -0
- package/templates/mcp-scaffolding/tests/service.test.cs.hbs +390 -0
- package/templates/mcp-scaffolding/tests/validator.test.cs.hbs +428 -0
- package/templates/ralph/README.md +3 -3
- package/templates/ralph/ralph.config.yaml +2 -2
- package/templates/skills/admin/SKILL.md +42 -0
- package/templates/skills/business-analyse/_shared.md +24 -1
- package/templates/skills/business-analyse/questionnaire/01-context.md +4 -4
- package/templates/skills/business-analyse/questionnaire/02-stakeholders.md +3 -3
- package/templates/skills/business-analyse/questionnaire/03-scope.md +4 -4
- package/templates/skills/business-analyse/questionnaire/04-data.md +7 -7
- package/templates/skills/business-analyse/questionnaire/05-integrations.md +1 -1
- package/templates/skills/business-analyse/questionnaire/06-security.md +3 -3
- package/templates/skills/business-analyse/questionnaire/07-ui.md +1 -1
- package/templates/skills/business-analyse/questionnaire/08-performance.md +3 -3
- package/templates/skills/business-analyse/questionnaire/09-constraints.md +4 -4
- package/templates/skills/business-analyse/questionnaire/10-documentation.md +2 -2
- package/templates/skills/business-analyse/questionnaire/11-data-lifecycle.md +2 -2
- package/templates/skills/business-analyse/questionnaire/12-migration.md +1 -1
- package/templates/skills/business-analyse/questionnaire/13-cross-module.md +2 -2
- package/templates/skills/business-analyse/steps/step-01-discover.md +50 -25
- package/templates/skills/business-analyse/steps/step-05-handoff.md +133 -34
- package/templates/skills/cc-agent/SKILL.md +129 -0
- package/templates/skills/cc-agent/references/agent-frontmatter.md +213 -0
- package/templates/skills/cc-agent/references/permission-modes.md +102 -0
- package/templates/skills/cc-agent/references/tools-reference.md +144 -0
- package/templates/skills/cc-agent/steps/step-00-init.md +134 -0
- package/templates/skills/cc-agent/steps/step-01-design.md +186 -0
- package/templates/skills/cc-agent/steps/step-02-generate.md +204 -0
- package/templates/skills/cc-agent/steps/step-03-validate.md +130 -0
- package/templates/skills/cc-agent/templates/agent-categorized.md +67 -0
- package/templates/skills/cc-agent/templates/agent-standalone.md +56 -0
- package/templates/skills/cc-agent/templates/agent-with-skills.md +94 -0
- package/templates/skills/cc-audit/SKILL.md +108 -0
- package/templates/skills/cc-audit/references/agent-checklist.md +91 -0
- package/templates/skills/cc-audit/references/hook-checklist.md +110 -0
- package/templates/skills/cc-audit/references/skill-checklist.md +70 -0
- package/templates/skills/cc-audit/steps/step-00-init.md +98 -0
- package/templates/skills/cc-audit/steps/step-01-scan.md +142 -0
- package/templates/skills/cc-audit/steps/step-02-analyze.md +158 -0
- package/templates/skills/cc-audit/steps/step-03-report.md +142 -0
- package/templates/skills/cc-skill/SKILL.md +134 -0
- package/templates/skills/cc-skill/references/best-practices.md +167 -0
- package/templates/skills/cc-skill/references/frontmatter-reference.md +182 -0
- package/templates/skills/cc-skill/references/skill-patterns.md +199 -0
- package/templates/skills/cc-skill/steps/step-00-init.md +119 -0
- package/templates/skills/cc-skill/steps/step-01-design.md +199 -0
- package/templates/skills/cc-skill/steps/step-02-generate.md +145 -0
- package/templates/skills/cc-skill/steps/step-03-steps.md +151 -0
- package/templates/skills/cc-skill/steps/step-04-validate.md +124 -0
- package/templates/skills/cc-skill/templates/skill-forked.md +85 -0
- package/templates/skills/cc-skill/templates/skill-progressive.md +102 -0
- package/templates/skills/cc-skill/templates/skill-simple.md +75 -0
- package/templates/skills/cc-skill/templates/step-template.md +82 -0
- package/templates/skills/check-version/SKILL.md +6 -0
- package/templates/skills/debug/SKILL.md +4 -0
- package/templates/skills/documentation/SKILL.md +1 -0
- package/templates/skills/efcore/SKILL.md +5 -0
- package/templates/skills/efcore/steps/db/step-deploy.md +26 -5
- package/templates/skills/efcore/steps/shared/step-00-init.md +21 -7
- package/templates/skills/explore/SKILL.md +28 -32
- package/templates/skills/feature-full/SKILL.md +1 -0
- package/templates/skills/gitflow/SKILL.md +8 -0
- package/templates/skills/gitflow/steps/step-start.md +45 -10
- package/templates/skills/mcp/SKILL.md +38 -18
- package/templates/skills/quick-search/SKILL.md +8 -1
- package/templates/skills/ralph-loop/SKILL.md +1 -1
- package/templates/skills/ralph-loop/steps/step-00-init.md +8 -68
- package/templates/skills/ralph-loop/steps/step-04-check.md +1 -1
- package/templates/skills/refactor/SKILL.md +1 -0
- package/templates/skills/review-code/SKILL.md +7 -1
- package/templates/skills/ui-components/SKILL.md +31 -438
- package/templates/skills/ui-components/accessibility.md +170 -0
- package/templates/skills/ui-components/patterns/data-table.md +39 -0
- package/templates/skills/ui-components/patterns/entity-card.md +77 -0
- package/templates/skills/ui-components/patterns/grid-layout.md +91 -0
- package/templates/skills/ui-components/patterns/kanban.md +43 -0
- package/templates/skills/ui-components/style-guide.md +86 -0
- package/templates/skills/utils/SKILL.md +1 -0
- package/templates/skills/validate/SKILL.md +1 -0
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
using Microsoft.EntityFrameworkCore.Migrations;
|
|
2
|
+
|
|
3
|
+
namespace SmartStack.Infrastructure.Data.Migrations.Core;
|
|
4
|
+
|
|
5
|
+
/// <summary>
|
|
6
|
+
/// Seed default RBAC roles for SmartStack
|
|
7
|
+
/// Generated on {{timestamp}}
|
|
8
|
+
///
|
|
9
|
+
/// All default roles have Scope = 'Core' (protected, cannot be deleted by clients)
|
|
10
|
+
/// Default Roles (aligned with Microsoft Fabric):
|
|
11
|
+
/// - Admin: Full access (read, create, update, delete)
|
|
12
|
+
/// - Member: Can write data (read, create, update) + manage users (add, update permissions) - no delete users, cannot assign roles >= own role
|
|
13
|
+
/// - Contributor: Can write data (read, create, update) - no delete, no user management
|
|
14
|
+
/// - Viewer: Read-only access (read)
|
|
15
|
+
///
|
|
16
|
+
/// Permission Matrix:
|
|
17
|
+
/// | Capability | Admin | Member | Contributor | Viewer |
|
|
18
|
+
/// |-------------------------|-------|--------|-------------|--------|
|
|
19
|
+
/// | Delete data | ✅ | ❌ | ❌ | ❌ |
|
|
20
|
+
/// | Delete users | ✅ | ❌ | ❌ | ❌ |
|
|
21
|
+
/// | Add/update users | ✅ | ✅ | ❌ | ❌ |
|
|
22
|
+
/// | Change permissions | ✅ | ✅* | ❌ | ❌ |
|
|
23
|
+
/// | Write data | ✅ | ✅ | ✅ | ❌ |
|
|
24
|
+
/// | Create items | ✅ | ✅ | ✅ | ❌ |
|
|
25
|
+
/// | Read data | ✅ | ✅ | ✅ | ✅ |
|
|
26
|
+
///
|
|
27
|
+
/// * Member cannot assign roles >= own role
|
|
28
|
+
/// </summary>
|
|
29
|
+
public partial class {{migrationName}} : Migration
|
|
30
|
+
{
|
|
31
|
+
protected override void Up(MigrationBuilder migrationBuilder)
|
|
32
|
+
{
|
|
33
|
+
// ============================================================================
|
|
34
|
+
// DEFAULT ROLES SEED (Microsoft Fabric Model)
|
|
35
|
+
// ============================================================================
|
|
36
|
+
// These roles follow Microsoft Fabric RBAC conventions
|
|
37
|
+
// Permissions are customizable per module via NavRoute
|
|
38
|
+
// ============================================================================
|
|
39
|
+
|
|
40
|
+
// Admin Role - Full Access
|
|
41
|
+
migrationBuilder.Sql(@"
|
|
42
|
+
DECLARE @AdminRoleId UNIQUEIDENTIFIER = NEWID();
|
|
43
|
+
|
|
44
|
+
IF NOT EXISTS (SELECT 1 FROM core.auth_Roles WHERE Code = 'admin')
|
|
45
|
+
BEGIN
|
|
46
|
+
INSERT INTO core.auth_Roles (
|
|
47
|
+
Id,
|
|
48
|
+
Code,
|
|
49
|
+
Scope,
|
|
50
|
+
Name,
|
|
51
|
+
Description,
|
|
52
|
+
IsDeleted,
|
|
53
|
+
CreatedAt,
|
|
54
|
+
UpdatedAt
|
|
55
|
+
)
|
|
56
|
+
VALUES (
|
|
57
|
+
@AdminRoleId,
|
|
58
|
+
'admin',
|
|
59
|
+
'Core',
|
|
60
|
+
'Admin',
|
|
61
|
+
'Full access to all features (read, create, update, delete)',
|
|
62
|
+
0,
|
|
63
|
+
GETUTCDATE(),
|
|
64
|
+
GETUTCDATE()
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
PRINT 'Role created: Admin (Scope: Core)';
|
|
68
|
+
|
|
69
|
+
-- Grant ALL permissions to Admin
|
|
70
|
+
INSERT INTO core.auth_RolePermissions (RoleId, PermissionId)
|
|
71
|
+
SELECT @AdminRoleId, Id
|
|
72
|
+
FROM core.auth_Permissions
|
|
73
|
+
WHERE IsDeleted = 0;
|
|
74
|
+
|
|
75
|
+
PRINT 'All permissions granted to Admin';
|
|
76
|
+
END
|
|
77
|
+
");
|
|
78
|
+
|
|
79
|
+
// Member Role - Can Write and Manage Users (with restrictions)
|
|
80
|
+
migrationBuilder.Sql(@"
|
|
81
|
+
DECLARE @MemberRoleId UNIQUEIDENTIFIER = NEWID();
|
|
82
|
+
|
|
83
|
+
IF NOT EXISTS (SELECT 1 FROM core.auth_Roles WHERE Code = 'member')
|
|
84
|
+
BEGIN
|
|
85
|
+
INSERT INTO core.auth_Roles (
|
|
86
|
+
Id,
|
|
87
|
+
Code,
|
|
88
|
+
Scope,
|
|
89
|
+
Name,
|
|
90
|
+
Description,
|
|
91
|
+
IsDeleted,
|
|
92
|
+
CreatedAt,
|
|
93
|
+
UpdatedAt
|
|
94
|
+
)
|
|
95
|
+
VALUES (
|
|
96
|
+
@MemberRoleId,
|
|
97
|
+
'member',
|
|
98
|
+
'Core',
|
|
99
|
+
'Member',
|
|
100
|
+
'Can read, create, and update content + manage users (add, update) - no delete',
|
|
101
|
+
0,
|
|
102
|
+
GETUTCDATE(),
|
|
103
|
+
GETUTCDATE()
|
|
104
|
+
);
|
|
105
|
+
|
|
106
|
+
PRINT 'Role created: Member (Scope: Core)';
|
|
107
|
+
|
|
108
|
+
-- Grant read, create, update permissions (excluding delete)
|
|
109
|
+
INSERT INTO core.auth_RolePermissions (RoleId, PermissionId)
|
|
110
|
+
SELECT @MemberRoleId, Id
|
|
111
|
+
FROM core.auth_Permissions
|
|
112
|
+
WHERE IsDeleted = 0
|
|
113
|
+
AND Code NOT LIKE '%.delete';
|
|
114
|
+
|
|
115
|
+
PRINT 'Read, create, update permissions granted to Member (including user management)';
|
|
116
|
+
PRINT 'Note: Business logic must enforce Member cannot assign roles >= own role';
|
|
117
|
+
END
|
|
118
|
+
");
|
|
119
|
+
|
|
120
|
+
// Contributor Role - Can Write Content (no user management, no delete)
|
|
121
|
+
migrationBuilder.Sql(@"
|
|
122
|
+
DECLARE @ContributorRoleId UNIQUEIDENTIFIER = NEWID();
|
|
123
|
+
|
|
124
|
+
IF NOT EXISTS (SELECT 1 FROM core.auth_Roles WHERE Code = 'contributor')
|
|
125
|
+
BEGIN
|
|
126
|
+
INSERT INTO core.auth_Roles (
|
|
127
|
+
Id,
|
|
128
|
+
Code,
|
|
129
|
+
Scope,
|
|
130
|
+
Name,
|
|
131
|
+
Description,
|
|
132
|
+
IsDeleted,
|
|
133
|
+
CreatedAt,
|
|
134
|
+
UpdatedAt
|
|
135
|
+
)
|
|
136
|
+
VALUES (
|
|
137
|
+
@ContributorRoleId,
|
|
138
|
+
'contributor',
|
|
139
|
+
'Core',
|
|
140
|
+
'Contributor',
|
|
141
|
+
'Can read, create, and update content (no user management, no delete)',
|
|
142
|
+
0,
|
|
143
|
+
GETUTCDATE(),
|
|
144
|
+
GETUTCDATE()
|
|
145
|
+
);
|
|
146
|
+
|
|
147
|
+
PRINT 'Role created: Contributor (Scope: Core)';
|
|
148
|
+
|
|
149
|
+
-- Grant read, create, update permissions (excluding delete and user management)
|
|
150
|
+
INSERT INTO core.auth_RolePermissions (RoleId, PermissionId)
|
|
151
|
+
SELECT @ContributorRoleId, Id
|
|
152
|
+
FROM core.auth_Permissions
|
|
153
|
+
WHERE IsDeleted = 0
|
|
154
|
+
AND Code NOT LIKE '%.delete'
|
|
155
|
+
AND Code NOT LIKE 'platform.administration.users.%'
|
|
156
|
+
AND Code NOT LIKE 'platform.administration.roles.%';
|
|
157
|
+
|
|
158
|
+
PRINT 'Read, create, update permissions granted to Contributor (excluding user management)';
|
|
159
|
+
END
|
|
160
|
+
");
|
|
161
|
+
|
|
162
|
+
// Viewer Role - Read-Only Access
|
|
163
|
+
migrationBuilder.Sql(@"
|
|
164
|
+
DECLARE @ViewerRoleId UNIQUEIDENTIFIER = NEWID();
|
|
165
|
+
|
|
166
|
+
IF NOT EXISTS (SELECT 1 FROM core.auth_Roles WHERE Code = 'viewer')
|
|
167
|
+
BEGIN
|
|
168
|
+
INSERT INTO core.auth_Roles (
|
|
169
|
+
Id,
|
|
170
|
+
Code,
|
|
171
|
+
Scope,
|
|
172
|
+
Name,
|
|
173
|
+
Description,
|
|
174
|
+
IsDeleted,
|
|
175
|
+
CreatedAt,
|
|
176
|
+
UpdatedAt
|
|
177
|
+
)
|
|
178
|
+
VALUES (
|
|
179
|
+
@ViewerRoleId,
|
|
180
|
+
'viewer',
|
|
181
|
+
'Core',
|
|
182
|
+
'Viewer',
|
|
183
|
+
'Read-only access to all assigned features',
|
|
184
|
+
0,
|
|
185
|
+
GETUTCDATE(),
|
|
186
|
+
GETUTCDATE()
|
|
187
|
+
);
|
|
188
|
+
|
|
189
|
+
PRINT 'Role created: Viewer (Scope: Core)';
|
|
190
|
+
|
|
191
|
+
-- Grant only read permissions
|
|
192
|
+
INSERT INTO core.auth_RolePermissions (RoleId, PermissionId)
|
|
193
|
+
SELECT @ViewerRoleId, Id
|
|
194
|
+
FROM core.auth_Permissions
|
|
195
|
+
WHERE IsDeleted = 0
|
|
196
|
+
AND Code LIKE '%.read';
|
|
197
|
+
|
|
198
|
+
PRINT 'Read permissions granted to Viewer';
|
|
199
|
+
END
|
|
200
|
+
");
|
|
201
|
+
|
|
202
|
+
// ============================================================================
|
|
203
|
+
// SUMMARY
|
|
204
|
+
// ============================================================================
|
|
205
|
+
migrationBuilder.Sql(@"
|
|
206
|
+
DECLARE @RoleCount INT = (SELECT COUNT(*) FROM core.auth_Roles WHERE IsDeleted = 0);
|
|
207
|
+
DECLARE @PermissionCount INT = (SELECT COUNT(*) FROM core.auth_Permissions WHERE IsDeleted = 0);
|
|
208
|
+
DECLARE @RolePermissionCount INT = (SELECT COUNT(*) FROM core.auth_RolePermissions);
|
|
209
|
+
|
|
210
|
+
PRINT '========================================';
|
|
211
|
+
PRINT 'Default Roles Seed Complete (Fabric Model)';
|
|
212
|
+
PRINT 'Roles: ' + CAST(@RoleCount AS NVARCHAR(10));
|
|
213
|
+
PRINT 'Permissions: ' + CAST(@PermissionCount AS NVARCHAR(10));
|
|
214
|
+
PRINT 'Role-Permission Assignments: ' + CAST(@RolePermissionCount AS NVARCHAR(10));
|
|
215
|
+
PRINT '========================================';
|
|
216
|
+
PRINT '';
|
|
217
|
+
PRINT 'Permission Matrix:';
|
|
218
|
+
PRINT '| Capability | Admin | Member | Contributor | Viewer |';
|
|
219
|
+
PRINT '|-------------------------|-------|--------|-------------|--------|';
|
|
220
|
+
PRINT '| Delete data | ✅ | ❌ | ❌ | ❌ |';
|
|
221
|
+
PRINT '| Delete users | ✅ | ❌ | ❌ | ❌ |';
|
|
222
|
+
PRINT '| Add/update users | ✅ | ✅ | ❌ | ❌ |';
|
|
223
|
+
PRINT '| Change permissions | ✅ | ✅* | ❌ | ❌ |';
|
|
224
|
+
PRINT '| Write data | ✅ | ✅ | ✅ | ❌ |';
|
|
225
|
+
PRINT '| Create items | ✅ | ✅ | ✅ | ❌ |';
|
|
226
|
+
PRINT '| Read data | ✅ | ✅ | ✅ | ✅ |';
|
|
227
|
+
PRINT '';
|
|
228
|
+
PRINT '* Member cannot assign roles >= own role (enforced in business logic)';
|
|
229
|
+
PRINT '========================================';
|
|
230
|
+
");
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
protected override void Down(MigrationBuilder migrationBuilder)
|
|
234
|
+
{
|
|
235
|
+
// ============================================================================
|
|
236
|
+
// ROLLBACK - Remove default roles
|
|
237
|
+
// ============================================================================
|
|
238
|
+
// WARNING: This will remove system roles and all associated permissions.
|
|
239
|
+
// User assignments to these roles will be orphaned.
|
|
240
|
+
// ============================================================================
|
|
241
|
+
|
|
242
|
+
// Remove role-permission assignments
|
|
243
|
+
migrationBuilder.Sql(@"
|
|
244
|
+
DELETE rp
|
|
245
|
+
FROM core.auth_RolePermissions rp
|
|
246
|
+
INNER JOIN core.auth_Roles r ON rp.RoleId = r.Id
|
|
247
|
+
WHERE r.Code IN ('admin', 'member', 'contributor', 'viewer');
|
|
248
|
+
");
|
|
249
|
+
|
|
250
|
+
// Soft delete roles
|
|
251
|
+
migrationBuilder.Sql(@"
|
|
252
|
+
UPDATE core.auth_Roles
|
|
253
|
+
SET IsDeleted = 1, UpdatedAt = GETUTCDATE()
|
|
254
|
+
WHERE Code IN ('admin', 'member', 'contributor', 'viewer');
|
|
255
|
+
");
|
|
256
|
+
|
|
257
|
+
migrationBuilder.Sql(@"
|
|
258
|
+
PRINT 'Default roles rollback complete';
|
|
259
|
+
");
|
|
260
|
+
}
|
|
261
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
using System;
|
|
2
|
+
using System.Threading;
|
|
3
|
+
using System.Threading.Tasks;
|
|
4
|
+
using System.Collections.Generic;
|
|
5
|
+
using Microsoft.Extensions.Logging;
|
|
6
|
+
|
|
7
|
+
namespace {{namespace}};
|
|
8
|
+
|
|
9
|
+
/// <summary>
|
|
10
|
+
/// Interface for {{name}} service operations
|
|
11
|
+
/// </summary>
|
|
12
|
+
public interface I{{name}}Service
|
|
13
|
+
{
|
|
14
|
+
{{#each methods}}
|
|
15
|
+
/// <summary>
|
|
16
|
+
/// {{this}} operation
|
|
17
|
+
/// </summary>
|
|
18
|
+
Task<object> {{this}}(CancellationToken cancellationToken = default);
|
|
19
|
+
|
|
20
|
+
{{/each}}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/// <summary>
|
|
24
|
+
/// Implementation of {{name}} service
|
|
25
|
+
/// </summary>
|
|
26
|
+
public class {{name}}Service : I{{name}}Service
|
|
27
|
+
{
|
|
28
|
+
private readonly ILogger<{{name}}Service> _logger;
|
|
29
|
+
|
|
30
|
+
public {{name}}Service(ILogger<{{name}}Service> logger)
|
|
31
|
+
{
|
|
32
|
+
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
{{#each methods}}
|
|
36
|
+
/// <inheritdoc />
|
|
37
|
+
public async Task<object> {{this}}(CancellationToken cancellationToken = default)
|
|
38
|
+
{
|
|
39
|
+
_logger.LogInformation("Executing {{this}} in {{../name}}Service");
|
|
40
|
+
|
|
41
|
+
// TODO: Implement {{this}} logic
|
|
42
|
+
await Task.CompletedTask;
|
|
43
|
+
|
|
44
|
+
throw new NotImplementedException("{{this}} is not yet implemented");
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
{{/each}}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// ============================================================================
|
|
51
|
+
// Registration (add to DependencyInjection.cs)
|
|
52
|
+
// ============================================================================
|
|
53
|
+
// services.AddScoped<I{{name}}Service, {{name}}Service>();
|