@lakindu_perera/toren 1.0.9 → 1.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.
- package/CHANGELOG.md +16 -0
- package/README.md +2 -0
- package/dist/cli/toren.js +8 -3
- package/dist/cli/toren.js.map +1 -1
- package/dist/detectors/technology-stack-detector.d.ts +105 -0
- package/dist/detectors/technology-stack-detector.js +1629 -0
- package/dist/detectors/technology-stack-detector.js.map +1 -0
- package/dist/focused-output.js +63 -2
- package/dist/focused-output.js.map +1 -1
- package/dist/renderers/console-renderer.d.ts +1 -0
- package/dist/renderers/console-renderer.js +56 -3
- package/dist/renderers/console-renderer.js.map +1 -1
- package/dist/renderers/html-renderer.js +78 -0
- package/dist/renderers/html-renderer.js.map +1 -1
- package/dist/renderers/index.d.ts +1 -0
- package/dist/scanner/scan.d.ts +19 -0
- package/dist/scanner/scan.js +64 -31
- package/dist/scanner/scan.js.map +1 -1
- package/dist/types/index.d.ts +64 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,22 @@ All notable changes to this project will be documented in this file.
|
|
|
4
4
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [1.1.0] - 2026-09-09
|
|
9
|
+
### Added
|
|
10
|
+
- Technology Stack detector for Testing, Build, Quality, Container, and Deployment tools.
|
|
11
|
+
- `--tech-stack` (and `--stack` alias) CLI flag for focused technology breakdown.
|
|
12
|
+
- Technology Stack section included in JSON, Console, Markdown, and HTML outputs.
|
|
13
|
+
- **Backend Framework Detection**: Detects Node.js (Express, Fastify, NestJS, Koa, Hapi), Python (Django, Flask, FastAPI), Java (Spring Boot), PHP (Laravel), and Ruby (Rails) backends using package dependency and structural file evidence only.
|
|
14
|
+
- **Database Detection**: Detects PostgreSQL, MySQL, MariaDB, SQLite, MongoDB, and Redis from package dependencies and config/schema files. Never reads `.env` files or credentials.
|
|
15
|
+
- **ORM / Data-Access Detection**: Independently detects Prisma, Drizzle, TypeORM, Sequelize, Mongoose, Knex, SQLAlchemy, Hibernate, Django ORM, Eloquent, and Active Record. ORMs are never inferred from database type and vice-versa.
|
|
16
|
+
- **Safety Guarantees**: `.env`, `.env.*` secret files are never read or inspected. Database URLs and credentials are never used as evidence. All signals are structural (package names, file presence, config files).
|
|
17
|
+
- **128 new tests** covering all backend, database, ORM detectors plus false-positive guards, `.env` safety, category ordering, and `scan()` integration fixtures.
|
|
18
|
+
|
|
19
|
+
## [1.0.10] - 2026-09-06
|
|
20
|
+
### Added
|
|
21
|
+
- **Full Tree Output**: Added a new `--all` (or `-a`) flag to the CLI. This flag bypasses the default display limit and prints the complete directory tree without hiding any files or folders, making it easier to view, copy, or document the entire file structure.
|
|
22
|
+
|
|
7
23
|
## [1.0.9] - 2026-08-31
|
|
8
24
|
### Changed
|
|
9
25
|
- **TypeScript Foundation**: Completely migrated the entire Torén codebase from JavaScript to TypeScript.
|
package/README.md
CHANGED
|
@@ -74,6 +74,7 @@ toren --scripts
|
|
|
74
74
|
toren --summary
|
|
75
75
|
toren --important-files
|
|
76
76
|
toren --health
|
|
77
|
+
toren --stack
|
|
77
78
|
|
|
78
79
|
# Lifecycle & Help Commands
|
|
79
80
|
toren --help
|
|
@@ -96,6 +97,7 @@ toren --uninstall
|
|
|
96
97
|
| `--summary` | Show project summary only. |
|
|
97
98
|
| `--important-files` | Show important files only. |
|
|
98
99
|
| `--health` | Show project health observations only. |
|
|
100
|
+
| `--stack`, `--tech-stack` | Show detected technology stack only. |
|
|
99
101
|
| `--format <type>` | Output format: `console` (default), `json`, `markdown`, `html`. |
|
|
100
102
|
| `--include-hidden` | Include hidden files and dot-directories in the scan. |
|
|
101
103
|
| `--max-files <n>` | Override the default 50,000-file scan limit. |
|
package/dist/cli/toren.js
CHANGED
|
@@ -64,8 +64,10 @@ Fast Repository Discovery CLI
|
|
|
64
64
|
--scripts Show available package scripts only
|
|
65
65
|
--summary Show project summary only
|
|
66
66
|
--important-files Show important files only
|
|
67
|
-
--health Show project health observations
|
|
67
|
+
--health Show project health observations
|
|
68
|
+
--stack, --tech-stack Show detected technology stack only
|
|
68
69
|
--include-hidden Include hidden files and folders
|
|
70
|
+
--all, -a Show complete directory tree without limits
|
|
69
71
|
--max-files <n> Set scan file limit
|
|
70
72
|
--doctor Run CLI diagnostics
|
|
71
73
|
--uninstall Remove Toren global installation
|
|
@@ -151,6 +153,8 @@ function parseArgs() {
|
|
|
151
153
|
const focusedMode = focusedInfo.mode;
|
|
152
154
|
// ── Hidden files ────────────────────────────────────────────────────────
|
|
153
155
|
const includeHidden = args.includes('--include-hidden');
|
|
156
|
+
// ── Show all files ──────────────────────────────────────────────────────
|
|
157
|
+
const showAllFiles = args.includes('--all') || args.includes('-a');
|
|
154
158
|
// ── Target path ─────────────────────────────────────────────────────────
|
|
155
159
|
// Build the set of tokens that are consumed as values by named flags so
|
|
156
160
|
// we don't accidentally treat them as the positional path argument.
|
|
@@ -186,6 +190,7 @@ function parseArgs() {
|
|
|
186
190
|
'--json',
|
|
187
191
|
...FOCUSED_FLAGS,
|
|
188
192
|
'--include-hidden',
|
|
193
|
+
'--all', '-a',
|
|
189
194
|
'--max-files',
|
|
190
195
|
]);
|
|
191
196
|
const unknownFlag = args.find(a => a.startsWith('-') && !knownFlags.has(a) && !consumedValues.has(a));
|
|
@@ -193,7 +198,7 @@ function parseArgs() {
|
|
|
193
198
|
printError('Unknown option', 'An unrecognized flag was provided.', 'Flag', unknownFlag);
|
|
194
199
|
return { action: 'exit', code: 1 };
|
|
195
200
|
}
|
|
196
|
-
return { action: 'scan', target, format, includeHidden, maxFiles, focusedMode };
|
|
201
|
+
return { action: 'scan', target, format, includeHidden, showAllFiles, maxFiles, focusedMode };
|
|
197
202
|
}
|
|
198
203
|
// ---------------------------------------------------------------------------
|
|
199
204
|
// Format validation
|
|
@@ -232,7 +237,7 @@ function assertValidFormat(format) {
|
|
|
232
237
|
renderFocusedMode(parsed.focusedMode, result);
|
|
233
238
|
}
|
|
234
239
|
else {
|
|
235
|
-
render(result, { cwd: process.cwd() });
|
|
240
|
+
render(result, { cwd: process.cwd(), showAllFiles: parsed.showAllFiles });
|
|
236
241
|
}
|
|
237
242
|
}
|
|
238
243
|
catch (err) {
|
package/dist/cli/toren.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toren.js","sourceRoot":"","sources":["../../src/cli/toren.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,IAAI,EAAE,MAAe,oBAAoB,CAAC;AACnD,OAAO,SAAS,MAAc,uBAAuB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC5F,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE1D,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAO,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAE9C,qDAAqD;AACrD,MAAM,cAAc,GAAG,SAAS,CAAC;AAEjC,2EAA2E;AAC3E,MAAM,iBAAiB,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAEjD,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,SAAS,UAAU,CAAC,KAAa,EAAE,OAAe,EAAE,WAAoB,EAAE,WAAoB;IAC5F,OAAO,CAAC,KAAK,CAAC,aAAa,KAAK,WAAW,CAAC,CAAC;IAC7C,OAAO,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;IAC9B,IAAI,WAAW,IAAI,WAAW,EAAE,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,GAAG,WAAW,KAAK,CAAC,CAAC;QACnC,OAAO,CAAC,KAAK,CAAC,GAAG,WAAW,IAAI,CAAC,CAAC;IACpC,CAAC;AACH,CAAC;AAED,SAAS,SAAS;IAChB,MAAM,UAAU,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;QAC3C,MAAM,MAAM,GAAG,CAAC,KAAK,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;QACzD,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC;IAC/C,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO,CAAC,GAAG,CAAC;uBACS,GAAG,CAAC,OAAO
|
|
1
|
+
{"version":3,"file":"toren.js","sourceRoot":"","sources":["../../src/cli/toren.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Toren — Technology Stack Detector (v1.1.0)
|
|
3
|
+
*
|
|
4
|
+
* Detects the technology stack of a project using pre-collected scan context.
|
|
5
|
+
* Does NOT re-scan the repository or re-read package.json.
|
|
6
|
+
*
|
|
7
|
+
* Design contract:
|
|
8
|
+
* - Consumes only the data already collected by scan() and passed in context.
|
|
9
|
+
* - Deterministic: same input always produces the same ordered output.
|
|
10
|
+
* - Confidence model:
|
|
11
|
+
* dependency / devDependency → +0.60 (strong)
|
|
12
|
+
* config file → +0.25 (strong supporting)
|
|
13
|
+
* file / directory evidence → +0.15 (supporting)
|
|
14
|
+
* script keyword → +0.15 (supporting)
|
|
15
|
+
* manifest → +0.15 (supporting)
|
|
16
|
+
* - Confidence is capped at 1.0.
|
|
17
|
+
* - Technologies below the CONFIDENCE_THRESHOLD (0.60) are suppressed.
|
|
18
|
+
* - When multiple rules match the same technology, evidence is merged and
|
|
19
|
+
* confidence is combined (capped), never producing duplicate entries.
|
|
20
|
+
* - Output is ordered by: category rank → confidence desc → name asc.
|
|
21
|
+
*
|
|
22
|
+
* Frontend technologies detected (Step 4):
|
|
23
|
+
* React, Next.js, Vue, Nuxt, Angular, Svelte, SvelteKit, Astro, Remix
|
|
24
|
+
*
|
|
25
|
+
* Styling technologies detected (Step 4):
|
|
26
|
+
* Tailwind CSS, Sass, Less, Styled Components, Emotion, Bootstrap,
|
|
27
|
+
* Material UI, Chakra UI
|
|
28
|
+
*
|
|
29
|
+
* Backend technologies detected (Step 5):
|
|
30
|
+
* Node.js: Express, Fastify, NestJS, Koa, Hapi
|
|
31
|
+
* Python: Django, Flask, FastAPI
|
|
32
|
+
* Java: Spring Boot
|
|
33
|
+
* PHP: Laravel
|
|
34
|
+
* Ruby: Rails
|
|
35
|
+
*
|
|
36
|
+
* Database technologies detected (Step 5):
|
|
37
|
+
* PostgreSQL, MySQL, MariaDB, SQLite, MongoDB, Redis
|
|
38
|
+
*
|
|
39
|
+
* ORM / data-access tools detected (Step 5):
|
|
40
|
+
* Prisma, Drizzle, TypeORM, Sequelize, Mongoose, Knex,
|
|
41
|
+
* SQLAlchemy, Hibernate, Django ORM, Eloquent, Active Record
|
|
42
|
+
*
|
|
43
|
+
* Testing frameworks detected (Step 6):
|
|
44
|
+
* Jest, Vitest, Mocha, Playwright, Cypress, Testing Library,
|
|
45
|
+
* Pytest, JUnit
|
|
46
|
+
*
|
|
47
|
+
* Build tools detected (Step 6):
|
|
48
|
+
* Vite, Webpack, Rollup, esbuild
|
|
49
|
+
*
|
|
50
|
+
* Quality tools detected (Step 6):
|
|
51
|
+
* ESLint, Prettier, Biome, Stylelint
|
|
52
|
+
*
|
|
53
|
+
* Container tools detected (Step 6):
|
|
54
|
+
* Docker, Docker Compose
|
|
55
|
+
*
|
|
56
|
+
* Deployment tools detected (Step 6):
|
|
57
|
+
* Vercel, Netlify, Fly.io, Railway, Render,
|
|
58
|
+
* Serverless Framework, AWS SAM
|
|
59
|
+
*
|
|
60
|
+
* False-positive / safety guards:
|
|
61
|
+
* - Directory names alone never trigger framework detection.
|
|
62
|
+
* - .env / secret files are NEVER read or scanned.
|
|
63
|
+
* - Database URLs / credentials are NEVER used as evidence.
|
|
64
|
+
* - ORM is never guessed from database type; each needs its own evidence.
|
|
65
|
+
* - Plain CSS files are never reported as a technology framework.
|
|
66
|
+
*
|
|
67
|
+
* @module detectors/technology-stack-detector
|
|
68
|
+
*/
|
|
69
|
+
import type { TechnologyStack, PackageManager, ScriptInfo } from '../types/index.js';
|
|
70
|
+
/**
|
|
71
|
+
* All information already collected by scan().
|
|
72
|
+
* The detector reuses this data — it never reads from disk again.
|
|
73
|
+
*/
|
|
74
|
+
export interface TechnologyDetectorContext {
|
|
75
|
+
/** Flat list of relative file paths (POSIX separators). */
|
|
76
|
+
flatFiles: string[];
|
|
77
|
+
/** Root-level config file names (already detected). */
|
|
78
|
+
configs: string[];
|
|
79
|
+
/** Enriched script entries. */
|
|
80
|
+
scripts: ScriptInfo[];
|
|
81
|
+
/** Detected package manager (or null). */
|
|
82
|
+
packageManager: PackageManager | null;
|
|
83
|
+
/** Detected project type string (e.g. "Next.js", "Node.js / TypeScript"). */
|
|
84
|
+
projectType: string;
|
|
85
|
+
/**
|
|
86
|
+
* Parsed package.json dependencies already available from a prior read.
|
|
87
|
+
* Keyed maps of name → version.
|
|
88
|
+
* Providing this avoids re-reading package.json.
|
|
89
|
+
*/
|
|
90
|
+
packageManifest?: {
|
|
91
|
+
dependencies?: Record<string, string>;
|
|
92
|
+
devDependencies?: Record<string, string>;
|
|
93
|
+
peerDependencies?: Record<string, string>;
|
|
94
|
+
} | null;
|
|
95
|
+
/** Frameworks already detected by project-info-detector. */
|
|
96
|
+
existingFrameworks?: string[];
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Detect the technology stack from already-collected scan context.
|
|
100
|
+
*
|
|
101
|
+
* @param context - Pre-collected scan data. No disk I/O is performed.
|
|
102
|
+
* @returns TechnologyStack with deduplicated, ordered, threshold-filtered
|
|
103
|
+
* technologies.
|
|
104
|
+
*/
|
|
105
|
+
export declare function detectTechnologyStack(context: TechnologyDetectorContext): TechnologyStack;
|