@ryuenn3123/agentic-senior-core 4.4.0 → 5.1.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.
Files changed (196) hide show
  1. package/.agents/plugins/marketplace.json +21 -0
  2. package/.agents/rules/agentic-senior-core.md +126 -0
  3. package/.claude-plugin/marketplace.json +17 -0
  4. package/.claude-plugin/plugin.json +17 -0
  5. package/.clinerules/agentic-senior-core.md +94 -0
  6. package/.codex-plugin/plugin.json +24 -0
  7. package/.cursor/rules/agentic-senior-core.mdc +99 -0
  8. package/.devin-plugin/plugin.json +13 -0
  9. package/.github/copilot-instructions.md +94 -0
  10. package/.github/plugin/marketplace.json +20 -0
  11. package/.github/plugin/plugin.json +16 -0
  12. package/.kiro/steering/agentic-senior-core.md +94 -0
  13. package/.openclaw/skills/asc/SKILL.md +23 -0
  14. package/.openclaw/skills/asc-audit/SKILL.md +28 -0
  15. package/.openclaw/skills/asc-review/SKILL.md +54 -0
  16. package/.opencode/plugins/agentic-senior-core.mjs +31 -0
  17. package/.windsurf/rules/agentic-senior-core.md +94 -0
  18. package/AGENTS.md +126 -127
  19. package/CONTRIBUTING.md +93 -63
  20. package/README.md +160 -111
  21. package/__init__.py +61 -0
  22. package/bin/agentic-senior-core.js +42 -41
  23. package/commands/asc-audit.md +1 -0
  24. package/commands/asc-audit.toml +2 -0
  25. package/commands/asc-help.md +9 -0
  26. package/commands/asc-help.toml +2 -0
  27. package/commands/asc-refactor.md +1 -0
  28. package/commands/asc-refactor.toml +2 -0
  29. package/commands/asc-review.md +1 -0
  30. package/commands/asc-review.toml +2 -0
  31. package/gemini-extension.json +10 -0
  32. package/hooks/copilot-hooks.json +21 -0
  33. package/hooks/hooks.json +31 -0
  34. package/hooks/session-start.js +36 -0
  35. package/hooks/subagent-start.js +38 -0
  36. package/lib/cli/commands/adapter.mjs +109 -0
  37. package/lib/cli/commands/clean.mjs +63 -0
  38. package/lib/cli/commands/status.mjs +94 -0
  39. package/package.json +43 -60
  40. package/plugin.yaml +16 -0
  41. package/scripts/uninstall.js +38 -0
  42. package/skills/asc/SKILL.md +16 -0
  43. package/skills/asc-audit/SKILL.md +28 -0
  44. package/skills/asc-refactor/SKILL.md +35 -0
  45. package/skills/asc-review/SKILL.md +54 -0
  46. package/.agent-context/policies/llm-judge-threshold.json +0 -29
  47. package/.agent-context/prompts/bootstrap-design.md +0 -63
  48. package/.agent-context/prompts/compact-natural-mode.md +0 -100
  49. package/.agent-context/prompts/init-project.md +0 -60
  50. package/.agent-context/prompts/refactor.md +0 -38
  51. package/.agent-context/prompts/review-code.md +0 -31
  52. package/.agent-context/review-checklists/architecture-review.md +0 -57
  53. package/.agent-context/review-checklists/pr-checklist.md +0 -134
  54. package/.agent-context/rules/api-docs.md +0 -24
  55. package/.agent-context/rules/api-versioning.md +0 -16
  56. package/.agent-context/rules/architecture.md +0 -38
  57. package/.agent-context/rules/background-jobs.md +0 -17
  58. package/.agent-context/rules/config-and-flags.md +0 -16
  59. package/.agent-context/rules/database-design.md +0 -18
  60. package/.agent-context/rules/docker-runtime.md +0 -17
  61. package/.agent-context/rules/error-handling.md +0 -16
  62. package/.agent-context/rules/event-driven.md +0 -16
  63. package/.agent-context/rules/frontend-architecture.md +0 -54
  64. package/.agent-context/rules/microservices.md +0 -16
  65. package/.agent-context/rules/migrations.md +0 -16
  66. package/.agent-context/rules/observability.md +0 -16
  67. package/.agent-context/rules/performance.md +0 -16
  68. package/.agent-context/rules/realtime.md +0 -16
  69. package/.agent-context/rules/resilience.md +0 -18
  70. package/.agent-context/rules/security.md +0 -18
  71. package/.agent-context/rules/testing.md +0 -16
  72. package/.agent-context/state/README.md +0 -25
  73. package/.agent-context/state/architecture-map.md +0 -40
  74. package/.agent-context/state/benchmark-comparison-schema.json +0 -181
  75. package/.agent-context/state/benchmark-reproducibility.json +0 -87
  76. package/.agent-context/state/benchmark-thresholds.json +0 -10
  77. package/.agent-context/state/benchmark-writer-judge-config.json +0 -58
  78. package/.agent-context/state/dependency-map.md +0 -41
  79. package/.agent-context/state/memory-adapter-contract.json +0 -52
  80. package/.agent-context/state/memory-schema-v1.json +0 -88
  81. package/GEMINI.md +0 -1
  82. package/benchmarks/README.md +0 -60
  83. package/benchmarks/compact-natural-mode/fixtures.mjs +0 -359
  84. package/benchmarks/compact-natural-mode/scorer.mjs +0 -331
  85. package/benchmarks/runtime-token-saver/fixtures.mjs +0 -836
  86. package/lib/cli/adaptive-context/catalog.mjs +0 -394
  87. package/lib/cli/adaptive-context/file-signals.mjs +0 -100
  88. package/lib/cli/adaptive-context/implications.mjs +0 -44
  89. package/lib/cli/adaptive-context.mjs +0 -151
  90. package/lib/cli/audits/typography-palette-anti-repeat/color-utils.mjs +0 -156
  91. package/lib/cli/audits/typography-palette-anti-repeat/file-scanner.mjs +0 -103
  92. package/lib/cli/audits/typography-palette-anti-repeat/typography-utils.mjs +0 -70
  93. package/lib/cli/backup.mjs +0 -210
  94. package/lib/cli/commands/context.mjs +0 -140
  95. package/lib/cli/commands/init/project-context.mjs +0 -60
  96. package/lib/cli/commands/init/runtime-environment.mjs +0 -59
  97. package/lib/cli/commands/init/setup-decisions.mjs +0 -83
  98. package/lib/cli/commands/init.mjs +0 -654
  99. package/lib/cli/commands/launch.mjs +0 -76
  100. package/lib/cli/commands/optimize.mjs +0 -284
  101. package/lib/cli/commands/rollback.mjs +0 -64
  102. package/lib/cli/commands/upgrade/token-optimization-state.mjs +0 -51
  103. package/lib/cli/commands/upgrade.mjs +0 -451
  104. package/lib/cli/compiler.mjs +0 -187
  105. package/lib/cli/constants.mjs +0 -136
  106. package/lib/cli/detector/constants.mjs +0 -135
  107. package/lib/cli/detector/design-evidence/collector.mjs +0 -256
  108. package/lib/cli/detector/design-evidence/constants.mjs +0 -39
  109. package/lib/cli/detector/design-evidence/file-traversal.mjs +0 -83
  110. package/lib/cli/detector/design-evidence/structured-attribute-evidence.mjs +0 -117
  111. package/lib/cli/detector/design-evidence/summary.mjs +0 -109
  112. package/lib/cli/detector/design-evidence/utility-helpers.mjs +0 -122
  113. package/lib/cli/detector/design-evidence.mjs +0 -25
  114. package/lib/cli/detector/stack-detection.mjs +0 -243
  115. package/lib/cli/detector/ui-signals.mjs +0 -150
  116. package/lib/cli/detector/workspace-scan.mjs +0 -177
  117. package/lib/cli/detector.mjs +0 -23
  118. package/lib/cli/init-detection-flow.mjs +0 -48
  119. package/lib/cli/init-options.mjs +0 -237
  120. package/lib/cli/init-selection.mjs +0 -29
  121. package/lib/cli/memory-continuity.mjs +0 -537
  122. package/lib/cli/preflight.mjs +0 -76
  123. package/lib/cli/project-scaffolder/constants.mjs +0 -69
  124. package/lib/cli/project-scaffolder/discovery.mjs +0 -272
  125. package/lib/cli/project-scaffolder/prompt-builders.mjs +0 -171
  126. package/lib/cli/project-scaffolder/storage.mjs +0 -144
  127. package/lib/cli/project-scaffolder/ui-scope-detection.mjs +0 -36
  128. package/lib/cli/project-scaffolder.mjs +0 -29
  129. package/lib/cli/rollback.mjs +0 -66
  130. package/lib/cli/token-optimization.mjs +0 -401
  131. package/lib/cli/utils/filesystem.mjs +0 -81
  132. package/lib/cli/utils/managed-surface.mjs +0 -280
  133. package/lib/cli/utils/prompting.mjs +0 -44
  134. package/lib/cli/utils.mjs +0 -479
  135. package/mcp.json +0 -134
  136. package/scripts/adaptive-context/fixtures.mjs +0 -183
  137. package/scripts/adaptive-context-benchmark.mjs +0 -9
  138. package/scripts/ascx-runtime-token-saver-benchmark.mjs +0 -9
  139. package/scripts/benchmark-evidence-bundle.mjs +0 -645
  140. package/scripts/benchmark-gate.mjs +0 -121
  141. package/scripts/benchmark-intelligence.mjs +0 -33
  142. package/scripts/benchmark-writer-judge-matrix.mjs +0 -379
  143. package/scripts/build-release-benchmark-bundle.mjs +0 -202
  144. package/scripts/bump-version.mjs +0 -103
  145. package/scripts/clean-local-artifacts.mjs +0 -78
  146. package/scripts/compact-natural-mode-benchmark.mjs +0 -9
  147. package/scripts/context-triggered-audit.mjs +0 -391
  148. package/scripts/detection-benchmark.mjs +0 -127
  149. package/scripts/docs-quality-drift-report.mjs +0 -358
  150. package/scripts/documentation-boundary-audit.mjs +0 -305
  151. package/scripts/explain-on-demand-audit.mjs +0 -427
  152. package/scripts/forbidden-content-check.mjs +0 -123
  153. package/scripts/frontend-usability-audit.mjs +0 -243
  154. package/scripts/generate-sbom.mjs +0 -61
  155. package/scripts/governance-weekly-report.mjs +0 -466
  156. package/scripts/llm-judge/checklist-loader.mjs +0 -45
  157. package/scripts/llm-judge/constants.mjs +0 -66
  158. package/scripts/llm-judge/diff-collection.mjs +0 -74
  159. package/scripts/llm-judge/prompting.mjs +0 -78
  160. package/scripts/llm-judge/providers.mjs +0 -111
  161. package/scripts/llm-judge/verdict.mjs +0 -134
  162. package/scripts/llm-judge.mjs +0 -200
  163. package/scripts/memory-continuity-benchmark.mjs +0 -322
  164. package/scripts/quality-trend-report.mjs +0 -289
  165. package/scripts/release-gate/audit-checks.mjs +0 -441
  166. package/scripts/release-gate/constants.mjs +0 -53
  167. package/scripts/release-gate/runtime.mjs +0 -63
  168. package/scripts/release-gate/static-checks.mjs +0 -182
  169. package/scripts/release-gate.mjs +0 -42
  170. package/scripts/rules-guardian-audit.mjs +0 -580
  171. package/scripts/single-source-lazy-loading-audit.mjs +0 -449
  172. package/scripts/sync-thin-adapters.mjs +0 -72
  173. package/scripts/token-optimization-benchmark.mjs +0 -252
  174. package/scripts/ui-design-judge/constants.mjs +0 -13
  175. package/scripts/ui-design-judge/design-execution-summary.mjs +0 -81
  176. package/scripts/ui-design-judge/git-input.mjs +0 -134
  177. package/scripts/ui-design-judge/prompting.mjs +0 -52
  178. package/scripts/ui-design-judge/providers.mjs +0 -102
  179. package/scripts/ui-design-judge/reporting.mjs +0 -183
  180. package/scripts/ui-design-judge/rubric-calibration.mjs +0 -214
  181. package/scripts/ui-design-judge/rubric-goldset.json +0 -188
  182. package/scripts/ui-design-judge.mjs +0 -319
  183. package/scripts/ui-rubric-calibration.mjs +0 -35
  184. package/scripts/validate/audits/cache-layer-contract.mjs +0 -230
  185. package/scripts/validate/audits/caching-scope-hygiene.mjs +0 -235
  186. package/scripts/validate/audits/file-size.mjs +0 -158
  187. package/scripts/validate/audits/reflection-citations.mjs +0 -130
  188. package/scripts/validate/audits/release-bundle.mjs +0 -135
  189. package/scripts/validate/audits/rule-id-uniqueness.mjs +0 -278
  190. package/scripts/validate/config.mjs +0 -501
  191. package/scripts/validate/coverage-checks.mjs +0 -446
  192. package/scripts/validate/file-structure.mjs +0 -158
  193. package/scripts/validate/markdown-content.mjs +0 -109
  194. package/scripts/validate/project-metadata.mjs +0 -166
  195. package/scripts/validate/utils.mjs +0 -52
  196. package/scripts/validate.mjs +0 -267
@@ -1,654 +0,0 @@
1
- // @file-size-exception: Interactive CLI flow with sequential prompts; planned for split in Phase 1 commands refactor.
2
- /**
3
- * Init Command — Interactive project initialization.
4
- * Depends on: constants, utils, detector, compiler
5
- */
6
- import { createInterface } from 'node:readline/promises';
7
- import { stdin, stdout } from 'node:process';
8
- import fs from 'node:fs/promises';
9
- import path from 'node:path';
10
-
11
- import {
12
- CLI_VERSION,
13
- AGENT_CONTEXT_DIR,
14
- INIT_PRESETS,
15
- PROFILE_PRESETS,
16
- GOLDEN_STANDARD_PROFILE_NAME,
17
- AGENT_DECISION_STACK_FILE_NAME,
18
- AGENT_DECISION_BLUEPRINT_FILE_NAME,
19
- } from '../constants.mjs';
20
-
21
- import {
22
- ensureDirectory,
23
- askYesNo,
24
- toTitleCase,
25
- collectFileNames,
26
- formatBlockingSeverities,
27
- formatDuration,
28
- copyGovernanceAssetsToTarget,
29
- pathExists,
30
- } from '../utils.mjs';
31
-
32
- import {
33
- detectProjectContext,
34
- buildDetectionSummary,
35
- formatDetectionCandidates,
36
- detectUiScopeSignals,
37
- } from '../detector.mjs';
38
- import { writeSelectedPolicy, writeOnboardingReport } from '../compiler.mjs';
39
- import {
40
- normalizeAdditionalStackSelection,
41
- normalizeAdditionalBlueprintSelection,
42
- } from '../init-selection.mjs';
43
- import {
44
- buildExistingProjectMajorConstraints,
45
- resolveDetectedSetupDecision,
46
- } from '../init-detection-flow.mjs';
47
- import { runPreflightChecks } from '../preflight.mjs';
48
- import {
49
- createBackup,
50
- ensureBackupGitignoreEntry,
51
- ensureRuntimeArtifactGitignoreEntries,
52
- ensureLocalGovernanceGitignoreEntries,
53
- } from '../backup.mjs';
54
- import {
55
- runProjectDiscovery,
56
- generateProjectDocumentation,
57
- isDirectoryEffectivelyEmpty,
58
- hasExistingProjectDocs,
59
- loadProjectConfig,
60
- normalizeDocsLanguage,
61
- } from '../project-scaffolder.mjs';
62
- import { performRollback } from '../rollback.mjs';
63
- import {
64
- createTokenOptimizationState,
65
- detectRtkBinary,
66
- normalizeAgentName,
67
- writeTokenOptimizationState,
68
- } from '../token-optimization.mjs';
69
- import {
70
- createMemoryContinuityState,
71
- ensureActiveMemorySnapshot,
72
- writeMemoryContinuityState,
73
- } from '../memory-continuity.mjs';
74
-
75
- import {
76
- detectRuntimeEnvironment,
77
- resolveRuntimeEnvironmentKeyFromLabel,
78
- resolveRuntimeEnvironmentLabelFromKey,
79
- } from './init/runtime-environment.mjs';
80
- import {
81
- inferProjectScopeFromDiscoveryAnswers,
82
- normalizeExplicitProfileFileName,
83
- resolveProjectScopeLabelFromKey,
84
- resolveSilentCiGuardrailsDefault,
85
- } from './init/setup-decisions.mjs';
86
- import { inferExistingProjectDescriptionHint } from './init/project-context.mjs';
87
-
88
- export { REPOSITORY_ROOT } from '../constants.mjs';
89
- export {
90
- parseInitArguments,
91
- normalizeRuntimeEnvironmentKey,
92
- } from '../init-options.mjs';
93
- export {
94
- resolveProjectScopeKeyFromLabel,
95
- normalizeAdditionalStackSelection,
96
- normalizeAdditionalBlueprintSelection,
97
- } from '../init-selection.mjs';
98
- export {
99
- detectRuntimeEnvironment,
100
- resolveRuntimeEnvironmentKeyFromLabel,
101
- resolveRuntimeEnvironmentLabelFromKey,
102
- } from './init/runtime-environment.mjs';
103
-
104
- export async function runInitCommand(targetDirectoryArgument, initOptions = {}) {
105
- const resolvedTargetDirectoryPath = path.resolve(targetDirectoryArgument || '.');
106
- const isTokenOptimizationEnabled = typeof initOptions.tokenOptimize === 'boolean'
107
- ? initOptions.tokenOptimize
108
- : true;
109
- const isMemoryContinuityEnabled = typeof initOptions.memoryContinuity === 'boolean'
110
- ? initOptions.memoryContinuity
111
- : true;
112
- const shouldIncludeMcpTemplate = initOptions.includeMcpTemplate === true;
113
- const selectedTokenAgentName = normalizeAgentName(initOptions.tokenAgent || 'copilot');
114
- const isInteractiveSession = Boolean(stdin.isTTY && stdout.isTTY);
115
-
116
- if (resolvedTargetDirectoryPath.toLowerCase() === 'c:\\windows' || resolvedTargetDirectoryPath.toLowerCase() === 'c:\\windows\\system32') {
117
- console.error('\n[FATAL] Target directory resolved to a Windows system folder (C:\\Windows).');
118
- console.error('If you are running Windows npm from inside WSL, this is caused by cmd.exe lacking UNC path support.');
119
- console.error('Please install and use a native Linux Node.js/npm directly inside WSL to setup your project.');
120
- process.exit(1);
121
- }
122
-
123
- const setupStartedAt = Date.now();
124
- await ensureDirectory(resolvedTargetDirectoryPath);
125
-
126
- const preflightResult = await runPreflightChecks(resolvedTargetDirectoryPath, 'init');
127
- if (!preflightResult.passed) {
128
- console.error('\n[FATAL] Preflight checks failed. Initializing here would cause errors or data loss:');
129
- console.error(JSON.stringify(preflightResult, null, 2));
130
- throw new Error('Preflight checks failed.');
131
- }
132
-
133
- const wasDirectoryEffectivelyEmpty = await isDirectoryEffectivelyEmpty(resolvedTargetDirectoryPath);
134
- const hadExistingProjectDocsBeforeInit = await hasExistingProjectDocs(resolvedTargetDirectoryPath);
135
-
136
- const userInterface = createInterface({ input: stdin, output: stdout });
137
-
138
- try {
139
- const discoveredStackFileNames = await collectFileNames(path.join(AGENT_CONTEXT_DIR, 'stacks'));
140
- const discoveredBlueprintFileNames = await collectFileNames(path.join(AGENT_CONTEXT_DIR, 'blueprints'));
141
-
142
- if (discoveredStackFileNames.length === 0 || discoveredBlueprintFileNames.length === 0) {
143
- console.log('[INFO] Static stack/blueprint profiles are not fully present. Using compatibility labels for dynamic reasoning mode.');
144
- }
145
-
146
- const selectedPreset = initOptions.preset ? INIT_PRESETS[initOptions.preset] || null : null;
147
-
148
- const selectedStackFileNameFromOption = initOptions.stack
149
- ? normalizeExplicitProfileFileName(initOptions.stack, discoveredStackFileNames)
150
- : null;
151
- const selectedBlueprintFileNameFromOption = initOptions.blueprint
152
- ? normalizeExplicitProfileFileName(initOptions.blueprint, discoveredBlueprintFileNames)
153
- : null;
154
-
155
- if (initOptions.preset && !selectedPreset) {
156
- throw new Error(`Unknown preset: ${initOptions.preset}`);
157
- }
158
-
159
- console.log(`\nAgentic-Senior-Core CLI v${CLI_VERSION}`);
160
- console.log('I will copy the project guidance pack into your target folder with AGENTS.md and native import bridges for your AI tools.');
161
-
162
- if (selectedPreset) {
163
- console.log(`Using preset: ${initOptions.preset} (${selectedPreset.description}).`);
164
- }
165
-
166
- const projectDetection = await detectProjectContext(resolvedTargetDirectoryPath);
167
- if (projectDetection.hasExistingProjectFiles) {
168
- console.log('I found files in the target directory, so I checked whether this already looks like an existing project.');
169
- console.log(buildDetectionSummary(projectDetection));
170
- console.log('Detection reasoning:');
171
- console.log(projectDetection.detectionReasoning);
172
- console.log('Top candidates:');
173
- console.log(formatDetectionCandidates(projectDetection.rankedCandidates));
174
- } else {
175
- console.log('The target directory is empty, so I will guide you through a fresh setup.');
176
- }
177
-
178
- const detectedRuntimeEnvironment = detectRuntimeEnvironment();
179
- let selectedRuntimeEnvironmentKey = initOptions.runtimeEnv === 'auto'
180
- ? detectedRuntimeEnvironment.key
181
- : initOptions.runtimeEnv;
182
-
183
- const selectedPolicyProfileName = initOptions.profile
184
- ? initOptions.profile
185
- : initOptions.newbie
186
- ? 'beginner'
187
- : GOLDEN_STANDARD_PROFILE_NAME;
188
-
189
- const selectedPolicyProfile = PROFILE_PRESETS[selectedPolicyProfileName];
190
- if (!selectedPolicyProfile) {
191
- throw new Error(`Unknown internal policy profile: ${selectedPolicyProfileName}`);
192
- }
193
-
194
- console.log(`\nReview thresholds: ${formatBlockingSeverities(selectedPolicyProfile.blockingSeverities)}.`);
195
-
196
- const detectionMajorConstraints = buildExistingProjectMajorConstraints();
197
- const detectionTransparency = {
198
- declaredAt: new Date().toISOString(),
199
- declarationType: projectDetection.hasExistingProjectFiles ? 'existing-project' : 'fresh-project',
200
- declarationShown: projectDetection.hasExistingProjectFiles,
201
- detectionSummary: projectDetection.hasExistingProjectFiles
202
- ? buildDetectionSummary(projectDetection)
203
- : 'No existing project markers were detected.',
204
- activeRulesSummary: {
205
- canonicalSource: 'AGENTS.md',
206
- compiledRulebook: null,
207
- legacyThinAdapters: [],
208
- generatedBridgeAdapters: ['CLAUDE.md', 'GEMINI.md'],
209
- stackLoadingMode: 'lazy',
210
- domainRuleLoadingMode: 'lazy',
211
- selectedProfile: selectedPolicyProfileName,
212
- selectedProfileDisplayName: selectedPolicyProfile.displayName,
213
- blockingSeverities: selectedPolicyProfile.blockingSeverities,
214
- ciGuardrailsEnabled: null,
215
- },
216
- majorConstraints: detectionMajorConstraints,
217
- quickConfirmation: {
218
- offered: false,
219
- response: projectDetection.hasExistingProjectFiles ? 'pending' : 'not-applicable',
220
- source: 'existing-project-detection',
221
- },
222
- decision: {
223
- mode: projectDetection.hasExistingProjectFiles ? 'pending' : 'fresh-directory',
224
- selectedStackFileName: null,
225
- selectedBlueprintFileName: null,
226
- },
227
- };
228
-
229
- if (projectDetection.hasExistingProjectFiles) {
230
- console.log('\nExisting project detection transparency:');
231
-
232
- if (projectDetection.detectedStackFileName) {
233
- const confidenceScoreLabel = Number(projectDetection.confidenceScore || 0).toFixed(2);
234
- console.log(
235
- `- Detected stack: ${toTitleCase(projectDetection.detectedStackFileName)} (${projectDetection.confidenceLabel}, score ${confidenceScoreLabel})`
236
- );
237
-
238
- if (projectDetection.secondaryStackFileNames?.length) {
239
- console.log(
240
- `- Secondary stack signals: ${projectDetection.secondaryStackFileNames.map((stackFileName) => toTitleCase(stackFileName)).join(', ')}`
241
- );
242
- }
243
- } else {
244
- console.log('- Detected stack: unresolved (insufficient markers).');
245
- }
246
-
247
- console.log('- Active rules baseline: canonical AGENTS.md + .agent-context/ lazy rule library');
248
- console.log(
249
- `- Active review thresholds: ${formatBlockingSeverities(selectedPolicyProfile.blockingSeverities)}`
250
- );
251
- console.log('- Major constraints:');
252
- for (const majorConstraint of detectionMajorConstraints) {
253
- console.log(` - ${majorConstraint}`);
254
- }
255
- }
256
-
257
- const hasReliableDetectedStack = projectDetection.hasExistingProjectFiles
258
- && projectDetection.detectedStackFileName
259
- && (projectDetection.confidenceLabel === 'high' || projectDetection.confidenceLabel === 'medium');
260
-
261
- const shouldAutoApplyDetectedStack = false;
262
- let selectedManualStackFileName = null;
263
- let selectedManualBlueprintFileName = null;
264
- let selectedAdditionalStackFileNames = [];
265
- let selectedAdditionalBlueprintFileNames = [];
266
- let detectedSetupWasApplied = false;
267
- let selectedProjectScopeKey = 'both';
268
- let selectedProjectScopeLabel = resolveProjectScopeLabelFromKey('both');
269
- let projectDescriptionHint = String(initOptions.projectDescription || '').trim();
270
- let discoveryAnswers = null;
271
- const ciGuardrailsSelection = resolveSilentCiGuardrailsDefault({
272
- initOptions,
273
- selectedPreset,
274
- selectedPolicyProfile,
275
- });
276
- const isFreshProjectTarget = !projectDetection.hasExistingProjectFiles
277
- && wasDirectoryEffectivelyEmpty
278
- && !hadExistingProjectDocsBeforeInit;
279
- const shouldRunInteractiveScaffolding = isInteractiveSession
280
- && (initOptions.scaffoldDocs === true || (initOptions.scaffoldDocs !== false && isFreshProjectTarget));
281
-
282
- if (projectDetection.hasExistingProjectFiles && !projectDescriptionHint) {
283
- projectDescriptionHint = await inferExistingProjectDescriptionHint(resolvedTargetDirectoryPath);
284
- if (projectDescriptionHint) {
285
- console.log(`- Project context evidence: ${projectDescriptionHint}`);
286
- } else {
287
- console.log('- Project context evidence: unresolved from lightweight file scan; agent must inspect project files before coding.');
288
- }
289
- }
290
- detectionTransparency.projectContextEvidence = projectDescriptionHint || null;
291
-
292
- const detectedSetupDecision = await resolveDetectedSetupDecision({
293
- shouldAutoApplyDetectedStack,
294
- projectDetection,
295
- detectionTransparency,
296
- initialSelectedManualStackFileName: selectedManualStackFileName,
297
- initialSelectedManualBlueprintFileName: selectedManualBlueprintFileName,
298
- initialSelectedAdditionalStackFileNames: selectedAdditionalStackFileNames,
299
- });
300
-
301
- detectedSetupWasApplied = detectedSetupDecision.detectedSetupWasApplied;
302
- selectedManualStackFileName = detectedSetupDecision.selectedManualStackFileName;
303
- selectedManualBlueprintFileName = detectedSetupDecision.selectedManualBlueprintFileName;
304
- selectedAdditionalStackFileNames = detectedSetupDecision.selectedAdditionalStackFileNames;
305
- if (initOptions.projectConfig) {
306
- discoveryAnswers = await loadProjectConfig(initOptions.projectConfig);
307
- console.log(`\nLoaded project configuration from: ${initOptions.projectConfig}`);
308
- } else if (shouldRunInteractiveScaffolding) {
309
- discoveryAnswers = await runProjectDiscovery(userInterface, {
310
- defaultProjectName: path.basename(resolvedTargetDirectoryPath),
311
- defaultProjectDescription: projectDescriptionHint,
312
- defaultIncludeCiGuardrails: ciGuardrailsSelection.value,
313
- askForCiGuardrails: ciGuardrailsSelection.shouldAsk,
314
- });
315
- } else if (initOptions.scaffoldDocs === true && !isInteractiveSession) {
316
- throw new Error('Non-interactive scaffolding requires --project-config when --scaffold-docs is enabled.');
317
- }
318
-
319
- if (discoveryAnswers?.projectDescription) {
320
- projectDescriptionHint = discoveryAnswers.projectDescription;
321
- }
322
-
323
- if (discoveryAnswers) {
324
- selectedProjectScopeKey = inferProjectScopeFromDiscoveryAnswers(discoveryAnswers);
325
- selectedProjectScopeLabel = resolveProjectScopeLabelFromKey(selectedProjectScopeKey);
326
- }
327
-
328
- const selectedResolvedStackFileName = selectedStackFileNameFromOption
329
- || selectedManualStackFileName
330
- || selectedPolicyProfile.defaultStackFileName
331
- || AGENT_DECISION_STACK_FILE_NAME;
332
-
333
- selectedAdditionalStackFileNames = normalizeAdditionalStackSelection(
334
- selectedResolvedStackFileName,
335
- selectedAdditionalStackFileNames
336
- );
337
-
338
- const selectedResolvedBlueprintFileName = selectedBlueprintFileNameFromOption
339
- || selectedManualBlueprintFileName
340
- || selectedPolicyProfile.defaultBlueprintFileName
341
- || AGENT_DECISION_BLUEPRINT_FILE_NAME;
342
-
343
- selectedAdditionalBlueprintFileNames = normalizeAdditionalBlueprintSelection(
344
- selectedResolvedBlueprintFileName,
345
- selectedAdditionalBlueprintFileNames.length > 0
346
- ? selectedAdditionalBlueprintFileNames
347
- : []
348
- );
349
-
350
- detectionTransparency.decision.selectedStackFileName = selectedResolvedStackFileName;
351
- detectionTransparency.decision.selectedBlueprintFileName = selectedResolvedBlueprintFileName;
352
- detectionTransparency.decision.selectedAdditionalStackFileNames = selectedAdditionalStackFileNames;
353
- detectionTransparency.decision.selectedAdditionalBlueprintFileNames = selectedAdditionalBlueprintFileNames;
354
- detectionTransparency.decision.usedDetectedSetup = detectedSetupWasApplied;
355
-
356
- const includeCiGuardrails = typeof discoveryAnswers?.includeCiGuardrails === 'boolean'
357
- ? discoveryAnswers.includeCiGuardrails
358
- : ciGuardrailsSelection.shouldAsk
359
- ? (!isInteractiveSession
360
- ? ciGuardrailsSelection.value
361
- : await askYesNo(
362
- 'Enable CI/CD quality checks (guardrails) and the LLM Judge policy?',
363
- userInterface,
364
- ciGuardrailsSelection.value
365
- ))
366
- : ciGuardrailsSelection.value;
367
-
368
- detectionTransparency.activeRulesSummary.ciGuardrailsEnabled = includeCiGuardrails;
369
-
370
- detectionTransparency.decision.selectedProjectScopeKey = selectedProjectScopeKey;
371
- detectionTransparency.decision.selectedProjectScopeLabel = selectedProjectScopeLabel;
372
-
373
- await createBackup(resolvedTargetDirectoryPath);
374
- const backupGitignoreResult = await ensureBackupGitignoreEntry(resolvedTargetDirectoryPath);
375
- if (backupGitignoreResult.status !== 'unchanged') {
376
- console.log(`Local backup artifacts ignored in .gitignore (${backupGitignoreResult.entry}).`);
377
- }
378
- const runtimeArtifactGitignoreResult = await ensureRuntimeArtifactGitignoreEntries(resolvedTargetDirectoryPath);
379
- if (runtimeArtifactGitignoreResult.status !== 'unchanged') {
380
- console.log(
381
- `Local runtime artifacts ignored in .gitignore (${runtimeArtifactGitignoreResult.addedEntries.join(', ')}).`
382
- );
383
- }
384
-
385
- const shouldKeepLocalOnly = typeof initOptions.localOnly === 'boolean'
386
- ? initOptions.localOnly
387
- : isInteractiveSession
388
- ? await askYesNo(
389
- 'Add AI instructions and governance files to .gitignore? (Prevents pushing them to GitHub/Git)',
390
- userInterface,
391
- false
392
- )
393
- : false;
394
-
395
- if (shouldKeepLocalOnly) {
396
- const localGovernanceGitignoreResult = await ensureLocalGovernanceGitignoreEntries(resolvedTargetDirectoryPath);
397
- if (localGovernanceGitignoreResult.status !== 'unchanged') {
398
- console.log(
399
- `AI governance files ignored in .gitignore (${localGovernanceGitignoreResult.addedEntries.join(', ')}).`
400
- );
401
- }
402
- }
403
-
404
- await copyGovernanceAssetsToTarget(resolvedTargetDirectoryPath, {
405
- includeMcpTemplate: shouldIncludeMcpTemplate,
406
- });
407
-
408
- let memoryContinuityState = null;
409
- if (isMemoryContinuityEnabled) {
410
- memoryContinuityState = createMemoryContinuityState({
411
- isEnabled: true,
412
- });
413
-
414
- await writeMemoryContinuityState(resolvedTargetDirectoryPath, memoryContinuityState);
415
- await ensureActiveMemorySnapshot(resolvedTargetDirectoryPath, {
416
- projectName: path.basename(resolvedTargetDirectoryPath),
417
- });
418
- console.log(`Project memory continuity metadata enabled (${memoryContinuityState.hydrationMode}, host-supported).`);
419
- }
420
-
421
- let tokenOptimizationState = null;
422
- if (isTokenOptimizationEnabled) {
423
- const detectedExternalProxy = detectRtkBinary();
424
- tokenOptimizationState = createTokenOptimizationState({
425
- isEnabled: true,
426
- selectedAgentName: selectedTokenAgentName,
427
- rtkDetection: detectedExternalProxy,
428
- });
429
-
430
- await writeTokenOptimizationState(resolvedTargetDirectoryPath, tokenOptimizationState);
431
- console.log(
432
- `Token optimization policy enabled for agent ${tokenOptimizationState.selectedAgent} (${tokenOptimizationState.preferredShellProxy}).`
433
- );
434
- }
435
-
436
- // --- Project Documentation Scaffolding ---
437
- let scaffoldingResult = null;
438
- const supplementalMaterializedDocFileNames = [];
439
- if (discoveryAnswers) {
440
- const normalizedConfigDocsLanguage = normalizeDocsLanguage(discoveryAnswers.docsLang || '');
441
- if (discoveryAnswers.docsLang && !normalizedConfigDocsLanguage) {
442
- throw new Error(`Unsupported docs language in project config: ${discoveryAnswers.docsLang}. Supported values: en, id`);
443
- }
444
-
445
- // Keep generated docs in English by default to align with the writing scope.
446
- // A different output language is only used when explicitly requested via --docs-lang.
447
- const selectedDocsLanguage = initOptions.docsLang;
448
-
449
- if (!initOptions.docsLangProvided && normalizedConfigDocsLanguage && normalizedConfigDocsLanguage !== 'en') {
450
- console.log('[INFO] Project config docsLang is set, but output defaults to English. Use --docs-lang to override.');
451
- }
452
-
453
- scaffoldingResult = await generateProjectDocumentation(
454
- resolvedTargetDirectoryPath,
455
- discoveryAnswers,
456
- {
457
- stackFileName: selectedResolvedStackFileName,
458
- additionalStackFileNames: selectedAdditionalStackFileNames,
459
- blueprintFileName: selectedResolvedBlueprintFileName,
460
- additionalBlueprintFileNames: selectedAdditionalBlueprintFileNames,
461
- runtimeEnvironmentKey: selectedRuntimeEnvironmentKey,
462
- runtimeEnvironmentLabel: resolveRuntimeEnvironmentLabelFromKey(selectedRuntimeEnvironmentKey),
463
- },
464
- {
465
- docsLanguage: selectedDocsLanguage,
466
- }
467
- );
468
-
469
- if (scaffoldingResult.bootstrapMode === 'ai-synthesis') {
470
- console.log(`\nAI synthesis bootstrap prompts generated in .agent-context/prompts/:`);
471
- for (const generatedPromptFileName of scaffoldingResult.generatedPromptFileNames || []) {
472
- console.log(` - .agent-context/prompts/${generatedPromptFileName}`);
473
- }
474
- for (const materializedFileName of scaffoldingResult.materializedFileNames || []) {
475
- console.log(` - docs/${materializedFileName}`);
476
- }
477
- console.log('Project docs will be authored dynamically by your IDE assistant from these prompts.');
478
- } else {
479
- console.log(`\nProject documentation generated in docs/:`);
480
- for (const generatedFileName of scaffoldingResult.generatedFileNames) {
481
- console.log(` - docs/${generatedFileName}`);
482
- }
483
- }
484
- }
485
-
486
- const existingProjectUiScopeSignals = projectDetection.hasExistingProjectFiles
487
- ? await detectUiScopeSignals({
488
- targetDirectoryPath: resolvedTargetDirectoryPath,
489
- selectedStackFileName: selectedResolvedStackFileName,
490
- selectedBlueprintFileName: selectedResolvedBlueprintFileName,
491
- })
492
- : null;
493
- const obsoleteDesignIntentPath = path.join(resolvedTargetDirectoryPath, 'docs', 'design-intent.json');
494
- if (await pathExists(obsoleteDesignIntentPath)) {
495
- try {
496
- await fs.unlink(obsoleteDesignIntentPath);
497
- supplementalMaterializedDocFileNames.push('design-intent.json (DELETED - Obsolete Compliance Theater)');
498
- console.log('\n[CLEANUP] Removed obsolete docs/design-intent.json. The 2026 Context Ops Paradigm uses plain-text DESIGN.md only.');
499
- } catch (err) {
500
- // ignore error
501
- }
502
- }
503
-
504
- await writeSelectedPolicy(resolvedTargetDirectoryPath, selectedPolicyProfileName);
505
-
506
- const setupDurationMs = Date.now() - setupStartedAt;
507
- await writeOnboardingReport({
508
- targetDirectoryPath: resolvedTargetDirectoryPath,
509
- selectedProfileName: selectedPolicyProfileName,
510
- selectedPreset: initOptions.preset || null,
511
- projectScope: {
512
- key: selectedProjectScopeKey,
513
- label: selectedProjectScopeLabel,
514
- },
515
- projectTopology: discoveryAnswers?.architectureStyle || null,
516
- selectedStackFileName: selectedResolvedStackFileName,
517
- selectedAdditionalStackFileNames,
518
- selectedBlueprintFileName: selectedResolvedBlueprintFileName,
519
- selectedAdditionalBlueprintFileNames,
520
- includeCiGuardrails,
521
- localOnly: shouldKeepLocalOnly,
522
- setupDurationMs,
523
- projectDetection,
524
- runtimeEnvironment: {
525
- selected: selectedRuntimeEnvironmentKey,
526
- selectedLabel: resolveRuntimeEnvironmentLabelFromKey(selectedRuntimeEnvironmentKey),
527
- detected: detectedRuntimeEnvironment.key,
528
- detectedLabel: detectedRuntimeEnvironment.label,
529
- detectionSource: detectedRuntimeEnvironment.source,
530
- },
531
- dockerStrategy: discoveryAnswers?.dockerStrategy || null,
532
- operationMode: 'init',
533
- tokenOptimization: {
534
- enabled: isTokenOptimizationEnabled,
535
- selectedAgent: selectedTokenAgentName,
536
- preferredShellProxy: tokenOptimizationState?.preferredShellProxy || null,
537
- stateFile: isTokenOptimizationEnabled ? '.agent-context/state/token-optimization.json' : null,
538
- },
539
- memoryContinuity: {
540
- enabled: isMemoryContinuityEnabled,
541
- hydrationMode: memoryContinuityState?.hydrationMode || null,
542
- adapters: memoryContinuityState?.adapters || [],
543
- stateFile: isMemoryContinuityEnabled ? '.agent-context/state/memory-continuity.json' : null,
544
- activeSnapshotFile: isMemoryContinuityEnabled ? '.agent-context/state/active-memory.json' : null,
545
- },
546
- detectionTransparency,
547
- uiScopeSignals: existingProjectUiScopeSignals,
548
- });
549
-
550
- console.log('\nInitialization complete.');
551
- console.log(`- Target directory: ${resolvedTargetDirectoryPath}`);
552
- if (initOptions.preset) {
553
- console.log(`- Preset: ${initOptions.preset}`);
554
- }
555
- if (!projectDetection.hasExistingProjectFiles) {
556
- console.log(`- Project domain: ${selectedProjectScopeLabel}`);
557
- if (discoveryAnswers?.architectureStyle) {
558
- console.log(`- Project topology: ${discoveryAnswers.architectureStyle}`);
559
- }
560
- }
561
- console.log(`- Runtime decision: ${selectedResolvedStackFileName === AGENT_DECISION_STACK_FILE_NAME ? 'agent recommendation required from current repo/brief evidence' : toTitleCase(selectedResolvedStackFileName)}`);
562
- if (selectedAdditionalStackFileNames.length > 0) {
563
- console.log(`- Additional stacks: ${selectedAdditionalStackFileNames.map((stackFileName) => toTitleCase(stackFileName)).join(', ')}`);
564
- }
565
- console.log(`- Architecture decision: ${selectedResolvedBlueprintFileName === AGENT_DECISION_BLUEPRINT_FILE_NAME ? 'agent recommendation required from current repo/brief evidence' : toTitleCase(selectedResolvedBlueprintFileName)}`);
566
- if (selectedAdditionalBlueprintFileNames.length > 0) {
567
- console.log(`- Additional blueprints: ${selectedAdditionalBlueprintFileNames.map((blueprintFileName) => toTitleCase(blueprintFileName)).join(', ')}`);
568
- }
569
- console.log(`- Runtime environment: ${resolveRuntimeEnvironmentLabelFromKey(selectedRuntimeEnvironmentKey)} (detected: ${detectedRuntimeEnvironment.label})`);
570
- console.log(`- CI/CD quality checks (guardrails): ${includeCiGuardrails ? 'enabled' : 'disabled'}`);
571
- console.log(`- Review thresholds: ${formatBlockingSeverities(selectedPolicyProfile.blockingSeverities)}`);
572
- console.log(`- Setup time: ${formatDuration(setupDurationMs)}`);
573
- console.log('- Generated files: AGENTS.md, CLAUDE.md, GEMINI.md, .agent-context/, and .agent-context/state/onboarding-report.json');
574
- console.log('- Default activation cues: Adaptive Context bootstrap, ASCX command wrappers, Compact Natural final replies');
575
- console.log('- Default response mode: Compact Natural Mode enabled (.agent-context/prompts/compact-natural-mode.md)');
576
- console.log('- CLI Usage: Install globally (`npm i -g @ryuenn3123/agentic-senior-core`) to use `ascx` directly, or prefix commands with `npx`.');
577
- if (scaffoldingResult?.bootstrapMode === 'ai-synthesis') {
578
- console.log(`- Bootstrap prompts: ${(scaffoldingResult.generatedPromptFileNames || []).length} files generated in .agent-context/prompts/`);
579
- if ((scaffoldingResult.materializedFileNames || []).length > 0) {
580
- console.log(`- Seed docs: ${(scaffoldingResult.materializedFileNames || []).length} files generated in docs/`);
581
- }
582
- console.log(`- Bootstrap docs language: ${scaffoldingResult.docsLanguage}`);
583
- console.log(`- Expected project docs after synthesis: ${scaffoldingResult.generatedFileNames.length} files in docs/`);
584
- } else if (scaffoldingResult) {
585
- console.log(`- Project docs: ${scaffoldingResult.generatedFileNames.length} files generated in docs/`);
586
- console.log(`- Project docs language: ${scaffoldingResult.docsLanguage}`);
587
- }
588
- if (supplementalMaterializedDocFileNames.length > 0) {
589
- console.log(`- Design seed docs: ${supplementalMaterializedDocFileNames.length} files generated in docs/`);
590
- }
591
- console.log(`- Repository workflows copied: no (workflows remain source-repo assets)`);
592
- console.log(`- MCP configuration: ${shouldIncludeMcpTemplate ? 'auto-configured for your IDEs (VS Code, Cursor, Zed, Gemini)' : 'disabled (use --mcp-template to enable)'}`);
593
- if (isMemoryContinuityEnabled) {
594
- console.log('- Memory continuity policy: enabled (index + selective hydration; host support required)');
595
- } else {
596
- console.log('- Memory continuity policy: disabled (--no-memory-continuity)');
597
- }
598
- if (isTokenOptimizationEnabled) {
599
- console.log(`- Token optimization policy: enabled for ${selectedTokenAgentName} (ASCX command guidance on)`);
600
- } else {
601
- console.log('- Token optimization policy: disabled (--no-token-optimize)');
602
- }
603
- console.log('\nPlain-language summary:');
604
- if (selectedResolvedStackFileName === AGENT_DECISION_STACK_FILE_NAME || selectedResolvedBlueprintFileName === AGENT_DECISION_BLUEPRINT_FILE_NAME) {
605
- console.log('I prepared a repo-grounded guidance pack that asks your AI agent to recommend runtime and architecture choices from the current brief, repo evidence, and live research before coding.');
606
- } else {
607
- console.log(`I prepared a repo-grounded guidance pack using your explicit runtime constraint (${toTitleCase(selectedResolvedStackFileName)}) and architecture constraint (${toTitleCase(selectedResolvedBlueprintFileName)}).`);
608
- }
609
- if (selectedAdditionalStackFileNames.length > 0) {
610
- console.log(`I also included additional stack context for ${selectedAdditionalStackFileNames.map((stackFileName) => toTitleCase(stackFileName)).join(', ')}.`);
611
- }
612
- if (selectedAdditionalBlueprintFileNames.length > 0) {
613
- console.log(`I also included additional blueprint context for ${selectedAdditionalBlueprintFileNames.map((blueprintFileName) => toTitleCase(blueprintFileName)).join(', ')}.`);
614
- }
615
- if (scaffoldingResult?.bootstrapMode === 'ai-synthesis') {
616
- console.log(`I prepared dynamic synthesis bootstrap prompts (${scaffoldingResult.docsLanguage}) so your IDE assistant can author project docs from scratch on first chat.`);
617
-
618
- const promptProjectName = scaffoldingResult.discoveryAnswers?.projectName || 'this project';
619
- console.log('\nPrompt starter examples (copy and adapt in your IDE):');
620
- console.log('- If docs/project-brief.md is missing, execute .agent-context/prompts/bootstrap-project-context.md now and create all required docs files.');
621
- if ((scaffoldingResult.generatedPromptFileNames || []).includes('bootstrap-design.md')) {
622
- console.log('- If docs/DESIGN.md is missing, execute .agent-context/prompts/bootstrap-design.md now before building UI components.');
623
- }
624
- console.log(`- Build an MVP for ${promptProjectName} using the newly synthesized docs as strict project context.`);
625
- console.log('- When scope changes, update docs/* in the same change so future prompts stay aligned.');
626
- } else if (scaffoldingResult) {
627
- console.log(`I also generated project documentation (${scaffoldingResult.docsLanguage}) based on your project description. AI agents will use docs/ as project context.`);
628
-
629
- const promptProjectName = scaffoldingResult.discoveryAnswers?.projectName || 'this project';
630
- console.log('\nPrompt starter examples (copy and adapt in your IDE):');
631
- console.log(`- Build an MVP for ${promptProjectName}. Follow Layer 9 docs and keep the current stack, database, and auth constraints.`);
632
- console.log('- Add [new feature] and update docs/project-brief.md plus docs/flow-overview.md in the same change.');
633
- console.log('- If this change needs architecture migration, propose a migration plan first, then implement after approval.');
634
- }
635
-
636
- console.log('Your AI tools will now receive AGENTS.md, native import bridges, and the lazy-loaded .agent-context rule library. Your review threshold is stored in .agent-context/policies/llm-judge-threshold.json.');
637
- console.log('MCP server registration is manual inside your IDE settings, even when mcp.json exists.');
638
- } catch (error) {
639
- console.error('\n[FATAL] An error occurred during initialization. Attempting automatic rollback...');
640
- try {
641
- const rollbackReport = await performRollback(resolvedTargetDirectoryPath);
642
- if (rollbackReport.success) {
643
- console.error('[OK] Automatic rollback successful. The directory has been restored.');
644
- } else {
645
- console.error('[WARN] Automatic rollback completed with errors. You may need to manually clean up.');
646
- }
647
- } catch (rbError) {
648
- console.error(`[FATAL] Automatic rollback failed: ${rbError.message}`);
649
- }
650
- throw error;
651
- } finally {
652
- userInterface.close();
653
- }
654
- }