@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.
Files changed (37) hide show
  1. package/.agent-context/review-checklists/frontend-excellence-rubric.md +54 -0
  2. package/.agent-context/review-checklists/frontend-skill-parity.md +1 -0
  3. package/.agent-context/review-checklists/frontend-usability.md +1 -0
  4. package/.agent-context/rules/docker-runtime.md +29 -0
  5. package/.agent-context/skills/frontend/README.md +1 -0
  6. package/.agent-context/skills/frontend.md +4 -0
  7. package/.agent-context/state/benchmark-evidence-bundle.json +672 -22
  8. package/.agent-context/state/benchmark-history.json +75 -0
  9. package/.agent-context/state/benchmark-trend-report.csv +5 -0
  10. package/.agent-context/state/benchmark-trend-report.json +140 -0
  11. package/.agent-context/state/benchmark-watchlist.json +3 -3
  12. package/.agent-context/state/memory-adapter-contract.json +52 -0
  13. package/.agent-context/state/memory-continuity-benchmark.json +132 -0
  14. package/.agent-context/state/memory-schema-v1.json +88 -0
  15. package/.cursorrules +1 -1
  16. package/.windsurfrules +1 -1
  17. package/README.md +29 -0
  18. package/lib/cli/commands/init.mjs +358 -16
  19. package/lib/cli/commands/optimize.mjs +12 -0
  20. package/lib/cli/commands/upgrade.mjs +30 -1
  21. package/lib/cli/compiler.mjs +55 -1
  22. package/lib/cli/constants.mjs +83 -0
  23. package/lib/cli/detector.mjs +11 -1
  24. package/lib/cli/memory-continuity.mjs +266 -0
  25. package/lib/cli/project-scaffolder.mjs +174 -1
  26. package/lib/cli/skill-selector.mjs +60 -38
  27. package/lib/cli/templates/architecture-decision-record.md.tmpl +39 -0
  28. package/lib/cli/templates/flow-overview.md.tmpl +12 -0
  29. package/lib/cli/templates/project-brief.md.id.tmpl +2 -0
  30. package/lib/cli/templates/project-brief.md.tmpl +26 -0
  31. package/lib/cli/utils.mjs +2 -1
  32. package/package.json +2 -1
  33. package/scripts/benchmark-evidence-bundle.mjs +493 -16
  34. package/scripts/frontend-usability-audit.mjs +21 -0
  35. package/scripts/memory-continuity-benchmark.mjs +322 -0
  36. package/scripts/release-gate.mjs +30 -0
  37. 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.1.0';
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(selectedStackFileName, selectedBlueprintFileName) {
46
+ export function inferSkillDomainNamesFromSelection(
47
+ selectedStackFileName,
48
+ selectedBlueprintFileName,
49
+ additionalStackFileNames = [],
50
+ additionalBlueprintFileNames = []
51
+ ) {
47
52
  const inferredDomainNames = new Set();
48
53
 
49
- if (selectedBlueprintFileName === 'api-nextjs.md' || selectedBlueprintFileName === 'fastapi-service.md') {
50
- inferredDomainNames.add('frontend');
51
- inferredDomainNames.add('fullstack');
52
- inferredDomainNames.add('cli');
53
- }
54
+ function applyStackSignals(stackFileName) {
55
+ if (stackFileName === 'typescript.md') {
56
+ inferredDomainNames.add('frontend');
57
+ inferredDomainNames.add('cli');
58
+ }
54
59
 
55
- if (selectedBlueprintFileName === 'go-service.md'
56
- || selectedBlueprintFileName === 'spring-boot-api.md'
57
- || selectedBlueprintFileName === 'laravel-api.md'
58
- || selectedBlueprintFileName === 'aspnet-api.md') {
59
- inferredDomainNames.add('backend');
60
- inferredDomainNames.add('fullstack');
61
- inferredDomainNames.add('cli');
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
- if (selectedStackFileName === 'typescript.md') {
65
- inferredDomainNames.add('frontend');
66
- inferredDomainNames.add('cli');
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
- if (selectedStackFileName === 'go.md'
70
- || selectedStackFileName === 'java.md'
71
- || selectedStackFileName === 'php.md'
72
- || selectedStackFileName === 'csharp.md'
73
- || selectedStackFileName === 'python.md'
74
- || selectedStackFileName === 'ruby.md'
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
- if (selectedStackFileName === 'react-native.md' || selectedStackFileName === 'flutter.md') {
80
- inferredDomainNames.add('frontend');
81
- inferredDomainNames.add('fullstack');
82
- inferredDomainNames.add('cli');
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
- if (selectedBlueprintFileName === 'mobile-app.md') {
86
- inferredDomainNames.add('frontend');
87
- inferredDomainNames.add('fullstack');
88
- inferredDomainNames.add('cli');
108
+ applyBlueprintSignals(selectedBlueprintFileName);
109
+
110
+ applyStackSignals(selectedStackFileName);
111
+ for (const additionalStackFileName of additionalStackFileNames) {
112
+ applyStackSignals(additionalStackFileName);
89
113
  }
90
114
 
91
- if (selectedBlueprintFileName === 'observability.md') {
92
- inferredDomainNames.add('backend');
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.25",
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",