@ryuenn3123/agentic-senior-core 2.0.25 → 2.0.27
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/review-checklists/frontend-excellence-rubric.md +54 -0
- package/.agent-context/review-checklists/frontend-skill-parity.md +1 -0
- package/.agent-context/review-checklists/frontend-usability.md +1 -0
- package/.agent-context/rules/docker-runtime.md +29 -0
- package/.agent-context/skills/frontend/README.md +1 -0
- package/.agent-context/skills/frontend.md +4 -0
- package/.agent-context/state/benchmark-evidence-bundle.json +672 -22
- package/.agent-context/state/benchmark-history.json +75 -0
- package/.agent-context/state/benchmark-trend-report.csv +5 -0
- package/.agent-context/state/benchmark-trend-report.json +140 -0
- package/.agent-context/state/benchmark-watchlist.json +3 -3
- package/.agent-context/state/memory-adapter-contract.json +52 -0
- package/.agent-context/state/memory-continuity-benchmark.json +132 -0
- package/.agent-context/state/memory-schema-v1.json +88 -0
- package/.cursorrules +1 -1
- package/.windsurfrules +1 -1
- package/README.md +29 -0
- package/lib/cli/commands/init.mjs +358 -16
- package/lib/cli/commands/optimize.mjs +12 -0
- package/lib/cli/commands/upgrade.mjs +30 -1
- package/lib/cli/compiler.mjs +55 -1
- package/lib/cli/constants.mjs +83 -0
- package/lib/cli/detector.mjs +11 -1
- package/lib/cli/memory-continuity.mjs +266 -0
- package/lib/cli/project-scaffolder.mjs +174 -1
- package/lib/cli/skill-selector.mjs +60 -38
- package/lib/cli/templates/architecture-decision-record.md.tmpl +39 -0
- package/lib/cli/templates/flow-overview.md.tmpl +12 -0
- package/lib/cli/templates/project-brief.md.id.tmpl +2 -0
- package/lib/cli/templates/project-brief.md.tmpl +26 -0
- package/lib/cli/utils.mjs +2 -1
- package/package.json +2 -1
- package/scripts/benchmark-evidence-bundle.mjs +493 -16
- package/scripts/frontend-usability-audit.mjs +21 -0
- package/scripts/memory-continuity-benchmark.mjs +322 -0
- package/scripts/release-gate.mjs +30 -0
- package/scripts/validate.mjs +5 -0
|
@@ -22,7 +22,7 @@ const PROJECT_DOC_FILE_NAMES = [
|
|
|
22
22
|
'flow-overview.md',
|
|
23
23
|
];
|
|
24
24
|
|
|
25
|
-
export const PROJECT_DOC_TEMPLATE_VERSION = '1.
|
|
25
|
+
export const PROJECT_DOC_TEMPLATE_VERSION = '1.2.0';
|
|
26
26
|
|
|
27
27
|
const DOMAIN_CHOICES = [
|
|
28
28
|
'API service',
|
|
@@ -50,6 +50,13 @@ const AUTH_CHOICES = [
|
|
|
50
50
|
'Other',
|
|
51
51
|
];
|
|
52
52
|
|
|
53
|
+
const DOCKER_STRATEGY_CHOICES = [
|
|
54
|
+
'No Docker (run services directly)',
|
|
55
|
+
'Docker for development only',
|
|
56
|
+
'Docker for production only',
|
|
57
|
+
'Docker for both development and production',
|
|
58
|
+
];
|
|
59
|
+
|
|
53
60
|
const DISCOVERY_MODE_CHOICES = [
|
|
54
61
|
'Quick mode (mostly choices, fastest)',
|
|
55
62
|
'Detailed mode (type your own answers)',
|
|
@@ -101,6 +108,100 @@ const FEATURE_PRESET_MAP = {
|
|
|
101
108
|
],
|
|
102
109
|
};
|
|
103
110
|
|
|
111
|
+
function parseBooleanLikeValue(rawValue) {
|
|
112
|
+
const normalizedValue = String(rawValue || '').trim().toLowerCase();
|
|
113
|
+
if (['true', 'yes', 'y', '1'].includes(normalizedValue)) {
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
if (['false', 'no', 'n', '0'].includes(normalizedValue)) {
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function resolveDockerStrategy({ dockerStrategy, useDocker, useDockerDevelopment, useDockerProduction }) {
|
|
125
|
+
if (typeof dockerStrategy === 'string' && dockerStrategy.trim().length > 0) {
|
|
126
|
+
const normalizedDockerStrategy = dockerStrategy.trim().toLowerCase();
|
|
127
|
+
const directMatch = DOCKER_STRATEGY_CHOICES.find(
|
|
128
|
+
(dockerStrategyChoice) => dockerStrategyChoice.toLowerCase() === normalizedDockerStrategy
|
|
129
|
+
);
|
|
130
|
+
|
|
131
|
+
if (directMatch) {
|
|
132
|
+
return directMatch;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
const normalizedUseDocker = typeof useDocker === 'boolean' ? useDocker : parseBooleanLikeValue(useDocker);
|
|
137
|
+
const normalizedUseDockerDevelopment = typeof useDockerDevelopment === 'boolean'
|
|
138
|
+
? useDockerDevelopment
|
|
139
|
+
: parseBooleanLikeValue(useDockerDevelopment);
|
|
140
|
+
const normalizedUseDockerProduction = typeof useDockerProduction === 'boolean'
|
|
141
|
+
? useDockerProduction
|
|
142
|
+
: parseBooleanLikeValue(useDockerProduction);
|
|
143
|
+
|
|
144
|
+
if (normalizedUseDocker === false) {
|
|
145
|
+
return DOCKER_STRATEGY_CHOICES[0];
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
if (normalizedUseDockerDevelopment === true && normalizedUseDockerProduction === true) {
|
|
149
|
+
return DOCKER_STRATEGY_CHOICES[3];
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
if (normalizedUseDockerDevelopment === true && normalizedUseDockerProduction !== true) {
|
|
153
|
+
return DOCKER_STRATEGY_CHOICES[1];
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
if (normalizedUseDockerProduction === true && normalizedUseDockerDevelopment !== true) {
|
|
157
|
+
return DOCKER_STRATEGY_CHOICES[2];
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
if (normalizedUseDocker === true) {
|
|
161
|
+
return DOCKER_STRATEGY_CHOICES[3];
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
return DOCKER_STRATEGY_CHOICES[0];
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
function parseDockerStrategy(dockerStrategy) {
|
|
168
|
+
const normalizedDockerStrategy = String(dockerStrategy || '').toLowerCase();
|
|
169
|
+
|
|
170
|
+
if (normalizedDockerStrategy.includes('both development and production')) {
|
|
171
|
+
return {
|
|
172
|
+
dockerStrategy: DOCKER_STRATEGY_CHOICES[3],
|
|
173
|
+
hasDocker: true,
|
|
174
|
+
useDockerDevelopment: true,
|
|
175
|
+
useDockerProduction: true,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
if (normalizedDockerStrategy.includes('development only')) {
|
|
180
|
+
return {
|
|
181
|
+
dockerStrategy: DOCKER_STRATEGY_CHOICES[1],
|
|
182
|
+
hasDocker: true,
|
|
183
|
+
useDockerDevelopment: true,
|
|
184
|
+
useDockerProduction: false,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
if (normalizedDockerStrategy.includes('production only')) {
|
|
189
|
+
return {
|
|
190
|
+
dockerStrategy: DOCKER_STRATEGY_CHOICES[2],
|
|
191
|
+
hasDocker: true,
|
|
192
|
+
useDockerDevelopment: false,
|
|
193
|
+
useDockerProduction: true,
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
return {
|
|
198
|
+
dockerStrategy: DOCKER_STRATEGY_CHOICES[0],
|
|
199
|
+
hasDocker: false,
|
|
200
|
+
useDockerDevelopment: false,
|
|
201
|
+
useDockerProduction: false,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
|
|
104
205
|
async function askFeatureList(userInterface) {
|
|
105
206
|
console.log('\nList your key features (one per line, press Enter to finish):');
|
|
106
207
|
|
|
@@ -253,6 +354,42 @@ export async function runProjectDiscovery(userInterface, options = {}) {
|
|
|
253
354
|
authStrategy = (await userInterface.question('Describe your auth setup: ')).trim() || 'Custom auth';
|
|
254
355
|
}
|
|
255
356
|
|
|
357
|
+
let dockerStrategy = DOCKER_STRATEGY_CHOICES[0];
|
|
358
|
+
if (isQuickMode) {
|
|
359
|
+
dockerStrategy = await askChoice(
|
|
360
|
+
'Containerization strategy:',
|
|
361
|
+
DOCKER_STRATEGY_CHOICES,
|
|
362
|
+
userInterface
|
|
363
|
+
);
|
|
364
|
+
} else {
|
|
365
|
+
const useDocker = await askYesNo(
|
|
366
|
+
'Use Docker for this project (development and/or production)?',
|
|
367
|
+
userInterface,
|
|
368
|
+
false
|
|
369
|
+
);
|
|
370
|
+
|
|
371
|
+
if (useDocker) {
|
|
372
|
+
const useDockerDevelopment = await askYesNo(
|
|
373
|
+
'Use Docker for development workflow?',
|
|
374
|
+
userInterface,
|
|
375
|
+
true
|
|
376
|
+
);
|
|
377
|
+
const useDockerProduction = await askYesNo(
|
|
378
|
+
'Use Docker for production runtime/build?',
|
|
379
|
+
userInterface,
|
|
380
|
+
true
|
|
381
|
+
);
|
|
382
|
+
|
|
383
|
+
dockerStrategy = resolveDockerStrategy({
|
|
384
|
+
useDocker,
|
|
385
|
+
useDockerDevelopment,
|
|
386
|
+
useDockerProduction,
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
const parsedDockerStrategy = parseDockerStrategy(dockerStrategy);
|
|
392
|
+
|
|
256
393
|
let features = [];
|
|
257
394
|
if (isQuickMode) {
|
|
258
395
|
const selectedFeaturePreset = await askChoice(
|
|
@@ -297,6 +434,9 @@ export async function runProjectDiscovery(userInterface, options = {}) {
|
|
|
297
434
|
primaryDomain,
|
|
298
435
|
databaseChoice,
|
|
299
436
|
authStrategy,
|
|
437
|
+
dockerStrategy: parsedDockerStrategy.dockerStrategy,
|
|
438
|
+
useDockerDevelopment: parsedDockerStrategy.useDockerDevelopment,
|
|
439
|
+
useDockerProduction: parsedDockerStrategy.useDockerProduction,
|
|
300
440
|
features,
|
|
301
441
|
additionalContext,
|
|
302
442
|
};
|
|
@@ -343,6 +483,13 @@ export function resolveDocumentManifest(discoveryAnswers) {
|
|
|
343
483
|
export function buildTemplateContext(discoveryAnswers, initContext) {
|
|
344
484
|
const hasDatabase = !discoveryAnswers.databaseChoice.toLowerCase().startsWith('none');
|
|
345
485
|
const hasAuth = !discoveryAnswers.authStrategy.toLowerCase().startsWith('none');
|
|
486
|
+
const additionalStackFileNames = Array.isArray(initContext.additionalStackFileNames)
|
|
487
|
+
? initContext.additionalStackFileNames
|
|
488
|
+
: [];
|
|
489
|
+
const additionalBlueprintFileNames = Array.isArray(initContext.additionalBlueprintFileNames)
|
|
490
|
+
? initContext.additionalBlueprintFileNames
|
|
491
|
+
: [];
|
|
492
|
+
const parsedDockerStrategy = parseDockerStrategy(discoveryAnswers.dockerStrategy);
|
|
346
493
|
|
|
347
494
|
const baseUrlMap = {
|
|
348
495
|
'API service': 'http://localhost:3000',
|
|
@@ -362,14 +509,34 @@ export function buildTemplateContext(discoveryAnswers, initContext) {
|
|
|
362
509
|
additionalContext: discoveryAnswers.additionalContext,
|
|
363
510
|
stackFileName: initContext.stackFileName,
|
|
364
511
|
stackDisplayName: toTitleCase(initContext.stackFileName),
|
|
512
|
+
additionalStackFileNames,
|
|
513
|
+
additionalStackDisplayNames: additionalStackFileNames.length > 0
|
|
514
|
+
? additionalStackFileNames.map((stackFileName) => toTitleCase(stackFileName))
|
|
515
|
+
: null,
|
|
365
516
|
blueprintFileName: initContext.blueprintFileName,
|
|
366
517
|
blueprintDisplayName: toTitleCase(initContext.blueprintFileName),
|
|
518
|
+
additionalBlueprintFileNames,
|
|
519
|
+
additionalBlueprintDisplayNames: additionalBlueprintFileNames.length > 0
|
|
520
|
+
? additionalBlueprintFileNames.map((blueprintFileName) => toTitleCase(blueprintFileName))
|
|
521
|
+
: null,
|
|
522
|
+
runtimeEnvironmentKey: initContext.runtimeEnvironmentKey || 'linux',
|
|
523
|
+
runtimeEnvironmentLabel: initContext.runtimeEnvironmentLabel || 'Linux',
|
|
367
524
|
cliVersion: CLI_VERSION,
|
|
368
525
|
templateVersion: PROJECT_DOC_TEMPLATE_VERSION,
|
|
369
526
|
generatedAt: new Date().toISOString(),
|
|
370
527
|
generatedDate: new Date().toISOString().split('T')[0],
|
|
371
528
|
hasDatabase,
|
|
372
529
|
hasAuth,
|
|
530
|
+
hasDocker: parsedDockerStrategy.hasDocker,
|
|
531
|
+
dockerStrategy: parsedDockerStrategy.dockerStrategy,
|
|
532
|
+
useDockerDevelopment: parsedDockerStrategy.useDockerDevelopment,
|
|
533
|
+
useDockerProduction: parsedDockerStrategy.useDockerProduction,
|
|
534
|
+
dockerDevelopmentGuidance: parsedDockerStrategy.useDockerDevelopment
|
|
535
|
+
? '- Development containers are required: optimize for fast rebuilds, bind mounts, and debug-friendly startup.'
|
|
536
|
+
: '',
|
|
537
|
+
dockerProductionGuidance: parsedDockerStrategy.useDockerProduction
|
|
538
|
+
? '- Production containers are required: use multi-stage builds, non-root runtime, and minimal image footprint.'
|
|
539
|
+
: '',
|
|
373
540
|
baseUrl: baseUrlMap[discoveryAnswers.primaryDomain] || 'http://localhost:3000',
|
|
374
541
|
};
|
|
375
542
|
}
|
|
@@ -595,6 +762,12 @@ export async function loadProjectConfig(configFilePath) {
|
|
|
595
762
|
primaryDomain: configEntries.primaryDomain || configEntries.domain || 'API service',
|
|
596
763
|
databaseChoice: configEntries.databaseChoice || configEntries.database || 'None (stateless service)',
|
|
597
764
|
authStrategy: configEntries.authStrategy || configEntries.auth || 'None (public service)',
|
|
765
|
+
dockerStrategy: resolveDockerStrategy({
|
|
766
|
+
dockerStrategy: configEntries.dockerStrategy || configEntries.containerStrategy,
|
|
767
|
+
useDocker: configEntries.useDocker,
|
|
768
|
+
useDockerDevelopment: configEntries.useDockerDevelopment || configEntries.dockerDevelopment,
|
|
769
|
+
useDockerProduction: configEntries.useDockerProduction || configEntries.dockerProduction,
|
|
770
|
+
}),
|
|
598
771
|
features: Array.isArray(configEntries.features) ? configEntries.features : [],
|
|
599
772
|
additionalContext: configEntries.additionalContext || configEntries.context || 'No additional context provided.',
|
|
600
773
|
docsLang: configEntries.docsLang || configEntries.docsLanguage || 'en',
|
|
@@ -43,55 +43,77 @@ export function formatSkillTierList(skillPlatformIndex) {
|
|
|
43
43
|
return skillPlatformIndex.tiers.map((tierDefinition) => `${tierDefinition.name} (${tierDefinition.description})`).join('\n');
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
-
export function inferSkillDomainNamesFromSelection(
|
|
46
|
+
export function inferSkillDomainNamesFromSelection(
|
|
47
|
+
selectedStackFileName,
|
|
48
|
+
selectedBlueprintFileName,
|
|
49
|
+
additionalStackFileNames = [],
|
|
50
|
+
additionalBlueprintFileNames = []
|
|
51
|
+
) {
|
|
47
52
|
const inferredDomainNames = new Set();
|
|
48
53
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
+
function applyStackSignals(stackFileName) {
|
|
55
|
+
if (stackFileName === 'typescript.md') {
|
|
56
|
+
inferredDomainNames.add('frontend');
|
|
57
|
+
inferredDomainNames.add('cli');
|
|
58
|
+
}
|
|
54
59
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
60
|
+
if (stackFileName === 'go.md'
|
|
61
|
+
|| stackFileName === 'java.md'
|
|
62
|
+
|| stackFileName === 'php.md'
|
|
63
|
+
|| stackFileName === 'csharp.md'
|
|
64
|
+
|| stackFileName === 'python.md'
|
|
65
|
+
|| stackFileName === 'ruby.md'
|
|
66
|
+
|| stackFileName === 'rust.md') {
|
|
67
|
+
inferredDomainNames.add('backend');
|
|
68
|
+
}
|
|
63
69
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
70
|
+
if (stackFileName === 'react-native.md' || stackFileName === 'flutter.md') {
|
|
71
|
+
inferredDomainNames.add('frontend');
|
|
72
|
+
inferredDomainNames.add('fullstack');
|
|
73
|
+
inferredDomainNames.add('cli');
|
|
74
|
+
}
|
|
67
75
|
}
|
|
68
76
|
|
|
69
|
-
|
|
70
|
-
||
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|| selectedStackFileName === 'rust.md') {
|
|
76
|
-
inferredDomainNames.add('backend');
|
|
77
|
-
}
|
|
77
|
+
function applyBlueprintSignals(blueprintFileName) {
|
|
78
|
+
if (blueprintFileName === 'api-nextjs.md' || blueprintFileName === 'fastapi-service.md') {
|
|
79
|
+
inferredDomainNames.add('frontend');
|
|
80
|
+
inferredDomainNames.add('fullstack');
|
|
81
|
+
inferredDomainNames.add('cli');
|
|
82
|
+
}
|
|
78
83
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
84
|
+
if (blueprintFileName === 'go-service.md'
|
|
85
|
+
|| blueprintFileName === 'spring-boot-api.md'
|
|
86
|
+
|| blueprintFileName === 'laravel-api.md'
|
|
87
|
+
|| blueprintFileName === 'aspnet-api.md'
|
|
88
|
+
|| blueprintFileName === 'nestjs-logic.md'
|
|
89
|
+
|| blueprintFileName === 'graphql-grpc-api.md') {
|
|
90
|
+
inferredDomainNames.add('backend');
|
|
91
|
+
inferredDomainNames.add('fullstack');
|
|
92
|
+
inferredDomainNames.add('cli');
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
if (blueprintFileName === 'mobile-app.md') {
|
|
96
|
+
inferredDomainNames.add('frontend');
|
|
97
|
+
inferredDomainNames.add('fullstack');
|
|
98
|
+
inferredDomainNames.add('cli');
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
if (blueprintFileName === 'observability.md') {
|
|
102
|
+
inferredDomainNames.add('backend');
|
|
103
|
+
inferredDomainNames.add('fullstack');
|
|
104
|
+
inferredDomainNames.add('cli');
|
|
105
|
+
}
|
|
83
106
|
}
|
|
84
107
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
108
|
+
applyBlueprintSignals(selectedBlueprintFileName);
|
|
109
|
+
|
|
110
|
+
applyStackSignals(selectedStackFileName);
|
|
111
|
+
for (const additionalStackFileName of additionalStackFileNames) {
|
|
112
|
+
applyStackSignals(additionalStackFileName);
|
|
89
113
|
}
|
|
90
114
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
inferredDomainNames.add('fullstack');
|
|
94
|
-
inferredDomainNames.add('cli');
|
|
115
|
+
for (const additionalBlueprintFileName of additionalBlueprintFileNames) {
|
|
116
|
+
applyBlueprintSignals(additionalBlueprintFileName);
|
|
95
117
|
}
|
|
96
118
|
|
|
97
119
|
if (inferredDomainNames.size === 0) {
|
|
@@ -18,9 +18,23 @@ This project requires a {{primaryDomain}} solution. The team evaluated available
|
|
|
18
18
|
### Decision
|
|
19
19
|
|
|
20
20
|
- **Language/Runtime**: {{stackDisplayName}} (source: `.agent-context/stacks/{{stackFileName}}`)
|
|
21
|
+
{{#if additionalStackDisplayNames}}
|
|
22
|
+
- **Additional runtime context**:
|
|
23
|
+
{{#each additionalStackDisplayNames}}
|
|
24
|
+
- {{this}}
|
|
25
|
+
{{/each}}
|
|
26
|
+
{{/if}}
|
|
21
27
|
- **Architecture blueprint**: {{blueprintDisplayName}} (source: `.agent-context/blueprints/{{blueprintFileName}}`)
|
|
28
|
+
{{#if additionalBlueprintDisplayNames}}
|
|
29
|
+
- **Additional architecture blueprints**:
|
|
30
|
+
{{#each additionalBlueprintDisplayNames}}
|
|
31
|
+
- {{this}}
|
|
32
|
+
{{/each}}
|
|
33
|
+
{{/if}}
|
|
22
34
|
- **Database**: {{databaseChoice}}
|
|
23
35
|
- **Auth**: {{authStrategy}}
|
|
36
|
+
- **Runtime environment target**: {{runtimeEnvironmentLabel}}
|
|
37
|
+
- **Containerization strategy**: {{dockerStrategy}}
|
|
24
38
|
|
|
25
39
|
### Rationale
|
|
26
40
|
|
|
@@ -36,6 +50,31 @@ The {{stackDisplayName}} stack was selected because:
|
|
|
36
50
|
- Database access must follow `.agent-context/rules/database-design.md`.
|
|
37
51
|
- API contracts must follow `.agent-context/rules/api-docs.md`.
|
|
38
52
|
|
|
53
|
+
{{#if hasDocker}}
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## ADR-004: Containerization Strategy (Dynamic)
|
|
57
|
+
|
|
58
|
+
**Status**: Accepted
|
|
59
|
+
**Date**: {{generatedDate}}
|
|
60
|
+
|
|
61
|
+
### Context
|
|
62
|
+
|
|
63
|
+
This project requires container support with separated development and production concerns.
|
|
64
|
+
|
|
65
|
+
### Decision
|
|
66
|
+
|
|
67
|
+
- Follow dynamic container generation based on real project dependencies and runtime profile.
|
|
68
|
+
- Do not rely on static Docker templates copied from unrelated repositories.
|
|
69
|
+
{{dockerDevelopmentGuidance}}
|
|
70
|
+
{{dockerProductionGuidance}}
|
|
71
|
+
|
|
72
|
+
### Consequences
|
|
73
|
+
|
|
74
|
+
- Development and production Docker artifacts are treated as separate deliverables.
|
|
75
|
+
- Changes in package/runtime dependencies must regenerate container setup instructions in the same change.
|
|
76
|
+
{{/if}}
|
|
77
|
+
|
|
39
78
|
---
|
|
40
79
|
|
|
41
80
|
## ADR-002: Architecture Pattern
|
|
@@ -12,6 +12,18 @@ Template version: {{templateVersion}}
|
|
|
12
12
|
**Domain**: {{primaryDomain}}
|
|
13
13
|
**Stack**: {{stackDisplayName}}
|
|
14
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}}
|
|
15
27
|
|
|
16
28
|
## High-Level Architecture
|
|
17
29
|
|
|
@@ -18,6 +18,8 @@ Versi template: {{templateVersion}}
|
|
|
18
18
|
**Blueprint**: {{blueprintDisplayName}}
|
|
19
19
|
**Database**: {{databaseChoice}}
|
|
20
20
|
**Strategi autentikasi**: {{authStrategy}}
|
|
21
|
+
**Target environment runtime**: {{runtimeEnvironmentLabel}}
|
|
22
|
+
**Strategi containerisasi**: {{dockerStrategy}}
|
|
21
23
|
|
|
22
24
|
## Fitur Kunci
|
|
23
25
|
|
|
@@ -15,9 +15,35 @@ Template version: {{templateVersion}}
|
|
|
15
15
|
## Technology Decisions
|
|
16
16
|
|
|
17
17
|
**Stack**: {{stackDisplayName}}
|
|
18
|
+
{{#if additionalStackDisplayNames}}
|
|
19
|
+
**Additional stacks**:
|
|
20
|
+
{{#each additionalStackDisplayNames}}
|
|
21
|
+
- {{this}}
|
|
22
|
+
{{/each}}
|
|
23
|
+
{{/if}}
|
|
18
24
|
**Blueprint**: {{blueprintDisplayName}}
|
|
25
|
+
{{#if additionalBlueprintDisplayNames}}
|
|
26
|
+
**Additional blueprints**:
|
|
27
|
+
{{#each additionalBlueprintDisplayNames}}
|
|
28
|
+
- {{this}}
|
|
29
|
+
{{/each}}
|
|
30
|
+
{{/if}}
|
|
19
31
|
**Database**: {{databaseChoice}}
|
|
20
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}}
|
|
21
47
|
|
|
22
48
|
## Key Features
|
|
23
49
|
|
package/lib/cli/utils.mjs
CHANGED
|
@@ -28,7 +28,7 @@ export function printUsage() {
|
|
|
28
28
|
console.log('');
|
|
29
29
|
console.log('Usage:');
|
|
30
30
|
console.log(' agentic-senior-core launch');
|
|
31
|
-
console.log(' agentic-senior-core init [target-directory] [--preset <name>] [--profile <beginner|balanced|strict>] [--profile-pack <name>] [--stack <name>] [--blueprint <name>] [--ci <true|false>] [--newbie] [--token-optimize] [--no-token-optimize] [--token-agent <name>] [--scaffold-docs] [--no-scaffold-docs] [--docs-lang <en|id>] [--project-config <path>]');
|
|
31
|
+
console.log(' agentic-senior-core init [target-directory] [--preset <name>] [--profile <beginner|balanced|strict>] [--profile-pack <name>] [--stack <name>] [--blueprint <name>] [--ci <true|false>] [--newbie] [--token-optimize] [--no-token-optimize] [--token-agent <name>] [--scaffold-docs] [--no-scaffold-docs] [--docs-lang <en|id>] [--project-config <path>] [--runtime-env <auto|linux-wsl|linux|windows|macos>]');
|
|
32
32
|
console.log(' agentic-senior-core upgrade [target-directory] [--dry-run] [--yes] [--mcp-template]');
|
|
33
33
|
console.log(' agentic-senior-core optimize [target-directory] [--agent <copilot|claude|cursor|windsurf|gemini|codex|cline>] [--enable|--disable] [--show]');
|
|
34
34
|
console.log(' agentic-senior-core mcp');
|
|
@@ -54,6 +54,7 @@ export function printUsage() {
|
|
|
54
54
|
console.log(' --no-scaffold-docs Skip project documentation scaffolding');
|
|
55
55
|
console.log(' --docs-lang Optional override for generated project docs language (default: en)');
|
|
56
56
|
console.log(' --project-config Path to a project config file for non-interactive doc scaffolding');
|
|
57
|
+
console.log(' --runtime-env Override runtime environment hint (auto, linux-wsl, linux, windows, macos)');
|
|
57
58
|
console.log(' --dry-run Preview upgrade without writing files');
|
|
58
59
|
console.log(' --yes Skip confirmation prompts for upgrade');
|
|
59
60
|
console.log(' --agent Target agent integration for token optimization mode');
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ryuenn3123/agentic-senior-core",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.27",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Force your AI Agent to code like a Staff Engineer, not a Junior.",
|
|
6
6
|
"bin": {
|
|
@@ -52,6 +52,7 @@
|
|
|
52
52
|
"benchmark:writer-judge": "node ./scripts/benchmark-writer-judge-matrix.mjs",
|
|
53
53
|
"benchmark:gate": "node ./scripts/benchmark-gate.mjs",
|
|
54
54
|
"benchmark:intelligence": "node ./scripts/benchmark-intelligence.mjs",
|
|
55
|
+
"benchmark:continuity": "node ./scripts/memory-continuity-benchmark.mjs",
|
|
55
56
|
"report:quality-trend": "node ./scripts/quality-trend-report.mjs",
|
|
56
57
|
"report:docs-quality-drift": "node ./scripts/docs-quality-drift-report.mjs",
|
|
57
58
|
"report:governance-weekly": "node ./scripts/governance-weekly-report.mjs",
|