Compare commits
40 Commits
Author | SHA1 | Date | |
---|---|---|---|
06f6fdef98 | |||
b6fb7bf029 | |||
4c83725120 | |||
a060cd1a03 | |||
e8372effc7 | |||
571249705e | |||
927cd961fd | |||
63b4fcc232 | |||
4188ed7f24 | |||
1feddc6e85 | |||
499baebc18 | |||
01fc0d0c6e | |||
b6c9cea5d1 | |||
a949039192 | |||
11bde9d756 | |||
eac26521c6 | |||
e1323569f5 | |||
41e4bd6689 | |||
164a58ec59 | |||
e1c0f82fe8 | |||
8a0046818b | |||
97fa9db32f | |||
d61de9b615 | |||
fba54035ea | |||
9a3d8588a8 | |||
eb8f8fa70a | |||
afe7b5e99e | |||
e074562362 | |||
240d6bb314 | |||
2d0839a1da | |||
9f250ae2b3 | |||
1223bb8567 | |||
9395cfc166 | |||
3b4c6bd97f | |||
5d2c9e6158 | |||
89977038ec | |||
b753c206b0 | |||
1965bd9b47 | |||
138d71e8c5 | |||
15397e8609 |
66
.gitea/workflows/default_nottags.yaml
Normal file
66
.gitea/workflows/default_nottags.yaml
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
name: Default (not tags)
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags-ignore:
|
||||||
|
- '**'
|
||||||
|
|
||||||
|
env:
|
||||||
|
IMAGE: code.foss.global/hosttoday/ht-docker-node:npmci
|
||||||
|
NPMCI_COMPUTED_REPOURL: https://${{gitea.repository_owner}}:${{secrets.GITEA_TOKEN}}@/${{gitea.repository}}.git
|
||||||
|
NPMCI_TOKEN_NPM: ${{secrets.NPMCI_TOKEN_NPM}}
|
||||||
|
NPMCI_TOKEN_NPM2: ${{secrets.NPMCI_TOKEN_NPM2}}
|
||||||
|
NPMCI_GIT_GITHUBTOKEN: ${{secrets.NPMCI_GIT_GITHUBTOKEN}}
|
||||||
|
NPMCI_URL_CLOUDLY: ${{secrets.NPMCI_URL_CLOUDLY}}
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
security:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
continue-on-error: true
|
||||||
|
container:
|
||||||
|
image: ${{ env.IMAGE }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Install pnpm and npmci
|
||||||
|
run: |
|
||||||
|
pnpm install -g pnpm
|
||||||
|
pnpm install -g @ship.zone/npmci
|
||||||
|
|
||||||
|
- name: Run npm prepare
|
||||||
|
run: npmci npm prepare
|
||||||
|
|
||||||
|
- name: Audit production dependencies
|
||||||
|
run: |
|
||||||
|
npmci command npm config set registry https://registry.npmjs.org
|
||||||
|
npmci command pnpm audit --audit-level=high --prod
|
||||||
|
continue-on-error: true
|
||||||
|
|
||||||
|
- name: Audit development dependencies
|
||||||
|
run: |
|
||||||
|
npmci command npm config set registry https://registry.npmjs.org
|
||||||
|
npmci command pnpm audit --audit-level=high --dev
|
||||||
|
continue-on-error: true
|
||||||
|
|
||||||
|
test:
|
||||||
|
if: ${{ always() }}
|
||||||
|
needs: security
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
container:
|
||||||
|
image: ${{ env.IMAGE }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Test stable
|
||||||
|
run: |
|
||||||
|
npmci node install stable
|
||||||
|
npmci npm install
|
||||||
|
npmci npm test
|
||||||
|
|
||||||
|
- name: Test build
|
||||||
|
run: |
|
||||||
|
npmci node install stable
|
||||||
|
npmci npm install
|
||||||
|
npmci npm build
|
124
.gitea/workflows/default_tags.yaml
Normal file
124
.gitea/workflows/default_tags.yaml
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
name: Default (tags)
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- '*'
|
||||||
|
|
||||||
|
env:
|
||||||
|
IMAGE: code.foss.global/hosttoday/ht-docker-node:npmci
|
||||||
|
NPMCI_COMPUTED_REPOURL: https://${{gitea.repository_owner}}:${{secrets.GITEA_TOKEN}}@/${{gitea.repository}}.git
|
||||||
|
NPMCI_TOKEN_NPM: ${{secrets.NPMCI_TOKEN_NPM}}
|
||||||
|
NPMCI_TOKEN_NPM2: ${{secrets.NPMCI_TOKEN_NPM2}}
|
||||||
|
NPMCI_GIT_GITHUBTOKEN: ${{secrets.NPMCI_GIT_GITHUBTOKEN}}
|
||||||
|
NPMCI_URL_CLOUDLY: ${{secrets.NPMCI_URL_CLOUDLY}}
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
security:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
continue-on-error: true
|
||||||
|
container:
|
||||||
|
image: ${{ env.IMAGE }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Prepare
|
||||||
|
run: |
|
||||||
|
pnpm install -g pnpm
|
||||||
|
pnpm install -g @ship.zone/npmci
|
||||||
|
npmci npm prepare
|
||||||
|
|
||||||
|
- name: Audit production dependencies
|
||||||
|
run: |
|
||||||
|
npmci command npm config set registry https://registry.npmjs.org
|
||||||
|
npmci command pnpm audit --audit-level=high --prod
|
||||||
|
continue-on-error: true
|
||||||
|
|
||||||
|
- name: Audit development dependencies
|
||||||
|
run: |
|
||||||
|
npmci command npm config set registry https://registry.npmjs.org
|
||||||
|
npmci command pnpm audit --audit-level=high --dev
|
||||||
|
continue-on-error: true
|
||||||
|
|
||||||
|
test:
|
||||||
|
if: ${{ always() }}
|
||||||
|
needs: security
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
container:
|
||||||
|
image: ${{ env.IMAGE }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Prepare
|
||||||
|
run: |
|
||||||
|
pnpm install -g pnpm
|
||||||
|
pnpm install -g @ship.zone/npmci
|
||||||
|
npmci npm prepare
|
||||||
|
|
||||||
|
- name: Test stable
|
||||||
|
run: |
|
||||||
|
npmci node install stable
|
||||||
|
npmci npm install
|
||||||
|
npmci npm test
|
||||||
|
|
||||||
|
- name: Test build
|
||||||
|
run: |
|
||||||
|
npmci node install stable
|
||||||
|
npmci npm install
|
||||||
|
npmci npm build
|
||||||
|
|
||||||
|
release:
|
||||||
|
needs: test
|
||||||
|
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
container:
|
||||||
|
image: ${{ env.IMAGE }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Prepare
|
||||||
|
run: |
|
||||||
|
pnpm install -g pnpm
|
||||||
|
pnpm install -g @ship.zone/npmci
|
||||||
|
npmci npm prepare
|
||||||
|
|
||||||
|
- name: Release
|
||||||
|
run: |
|
||||||
|
npmci node install stable
|
||||||
|
npmci npm publish
|
||||||
|
|
||||||
|
metadata:
|
||||||
|
needs: test
|
||||||
|
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
container:
|
||||||
|
image: ${{ env.IMAGE }}
|
||||||
|
continue-on-error: true
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Prepare
|
||||||
|
run: |
|
||||||
|
pnpm install -g pnpm
|
||||||
|
pnpm install -g @ship.zone/npmci
|
||||||
|
npmci npm prepare
|
||||||
|
|
||||||
|
- name: Code quality
|
||||||
|
run: |
|
||||||
|
npmci command npm install -g typescript
|
||||||
|
npmci npm install
|
||||||
|
|
||||||
|
- name: Trigger
|
||||||
|
run: npmci trigger
|
||||||
|
|
||||||
|
- name: Build docs and upload artifacts
|
||||||
|
run: |
|
||||||
|
npmci node install stable
|
||||||
|
npmci npm install
|
||||||
|
pnpm install -g @git.zone/tsdoc
|
||||||
|
npmci command tsdoc
|
||||||
|
continue-on-error: true
|
37
changelog.md
Normal file
37
changelog.md
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
# Changelog
|
||||||
|
|
||||||
|
## 23.06.2024 - 1.3.1 - {{nextVersionScope}}
|
||||||
|
fix(aidocs_classes): Fix typo in INextCommitObject interface
|
||||||
|
{{nextVersionDetails}}
|
||||||
|
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
## [1.2.4]
|
||||||
|
### Fixed
|
||||||
|
- Refactor logger initialization to use commitinfo data
|
||||||
|
|
||||||
|
## 1.3.0
|
||||||
|
feat(core): Added smarttime dependency and improved changelog generation
|
||||||
|
```
|
||||||
|
|
||||||
|
## [1.2.4] - 1.2.4
|
||||||
|
fix(logging): Refactor logger initialization to use commitinfo data
|
||||||
|
|
||||||
|
## [1.2.3]
|
||||||
|
fix(aidocs): Fix bug in AiDoc class causing undefined token handling
|
||||||
|
|
||||||
|
## [1.2.2] - 2023-11-20
|
||||||
|
### Fixed
|
||||||
|
- Fix bug in AiDoc class causing undefined token handling
|
||||||
|
|
||||||
|
## [1.2.1] - 2023-11-10
|
||||||
|
### Fixed
|
||||||
|
- Fixed usage of plugins in project context and readme generation
|
||||||
|
|
||||||
|
## [1.2.0] - 2023-11-01
|
||||||
|
### Added
|
||||||
|
- Enhance changelog generation by supporting complete generation in the absence of previous changelog files
|
||||||
|
|
||||||
|
## [1.1.42] - 2023-10-30
|
||||||
|
### Fixed
|
||||||
|
- Improve commit message generation by handling empty diffs and updating changelog instructions
|
40
package.json
40
package.json
@ -1,12 +1,13 @@
|
|||||||
{
|
{
|
||||||
"name": "@git.zone/tsdoc",
|
"name": "@git.zone/tsdoc",
|
||||||
"version": "1.1.29",
|
"version": "1.3.1",
|
||||||
"private": false,
|
"private": false,
|
||||||
"description": "An advanced TypeScript documentation tool using AI to generate and enhance documentation for TypeScript projects.",
|
"description": "An advanced TypeScript documentation tool using AI to generate and enhance documentation for TypeScript projects.",
|
||||||
"main": "dist_ts/index.js",
|
|
||||||
"typings": "dist_ts/index.d.ts",
|
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"author": "Lossless GmbH",
|
"exports": {
|
||||||
|
".": "./dist_ts/index.js"
|
||||||
|
},
|
||||||
|
"author": "Task Venture Capital GmbH",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"bin": {
|
"bin": {
|
||||||
"tsdoc": "cli.js"
|
"tsdoc": "cli.js"
|
||||||
@ -14,30 +15,33 @@
|
|||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "(tstest test/) && npm run testCli",
|
"test": "(tstest test/) && npm run testCli",
|
||||||
"testCli": "(node ./cli.ts.js) && (node ./cli.ts.js aidocs)",
|
"testCli": "(node ./cli.ts.js) && (node ./cli.ts.js aidocs)",
|
||||||
"build": "(tsbuild --web --allowimplicitany)"
|
"build": "(tsbuild --web --allowimplicitany)",
|
||||||
|
"buildDocs": "tsdoc"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@git.zone/tsbuild": "^2.1.76",
|
"@git.zone/tsbuild": "^2.1.80",
|
||||||
"@git.zone/tsrun": "^1.2.46",
|
"@git.zone/tsrun": "^1.2.46",
|
||||||
"@git.zone/tstest": "^1.0.90",
|
"@git.zone/tstest": "^1.0.90",
|
||||||
"@push.rocks/tapbundle": "^5.0.23",
|
"@push.rocks/tapbundle": "^5.0.23",
|
||||||
"@types/node": "^20.12.12"
|
"@types/node": "^20.14.8"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@push.rocks/early": "^4.0.3",
|
"@push.rocks/early": "^4.0.3",
|
||||||
"@push.rocks/npmextra": "^5.0.13",
|
"@push.rocks/npmextra": "^5.0.23",
|
||||||
"@push.rocks/qenv": "^6.0.5",
|
"@push.rocks/qenv": "^6.0.5",
|
||||||
"@push.rocks/smartai": "^0.0.17",
|
"@push.rocks/smartai": "^0.0.17",
|
||||||
"@push.rocks/smartcli": "^4.0.10",
|
"@push.rocks/smartcli": "^4.0.11",
|
||||||
"@push.rocks/smartdelay": "^3.0.5",
|
"@push.rocks/smartdelay": "^3.0.5",
|
||||||
"@push.rocks/smartfile": "^11.0.14",
|
"@push.rocks/smartfile": "^11.0.20",
|
||||||
|
"@push.rocks/smartgit": "^3.0.4",
|
||||||
"@push.rocks/smartinteract": "^2.0.15",
|
"@push.rocks/smartinteract": "^2.0.15",
|
||||||
"@push.rocks/smartlog": "^3.0.1",
|
"@push.rocks/smartlog": "^3.0.7",
|
||||||
"@push.rocks/smartlog-destination-local": "^9.0.2",
|
"@push.rocks/smartlog-destination-local": "^9.0.2",
|
||||||
"@push.rocks/smartpath": "^5.0.18",
|
"@push.rocks/smartpath": "^5.0.18",
|
||||||
"@push.rocks/smartshell": "^3.0.5",
|
"@push.rocks/smartshell": "^3.0.5",
|
||||||
"typedoc": "^0.25.13",
|
"@push.rocks/smarttime": "^4.0.6",
|
||||||
"typescript": "^5.4.5"
|
"typedoc": "^0.26.0",
|
||||||
|
"typescript": "^5.5.2"
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
"ts/**/*",
|
"ts/**/*",
|
||||||
@ -65,5 +69,13 @@
|
|||||||
"API documentation",
|
"API documentation",
|
||||||
"technical writing",
|
"technical writing",
|
||||||
"code quality improvement"
|
"code quality improvement"
|
||||||
]
|
],
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git+https://gitlab.com/gitzone/tsdoc.git"
|
||||||
|
},
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://gitlab.com/gitzone/tsdoc/issues"
|
||||||
|
},
|
||||||
|
"homepage": "https://gitlab.com/gitzone/tsdoc#readme"
|
||||||
}
|
}
|
||||||
|
585
pnpm-lock.yaml
generated
585
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
13
readme.md
13
readme.md
@ -1,4 +1,5 @@
|
|||||||
# @git.zone/tsdoc
|
# @git.zone/tsdoc
|
||||||
|
|
||||||
An advanced TypeScript documentation tool using AI to generate and enhance documentation for TypeScript projects.
|
An advanced TypeScript documentation tool using AI to generate and enhance documentation for TypeScript projects.
|
||||||
|
|
||||||
## Install
|
## Install
|
||||||
@ -62,7 +63,7 @@ const tsconfigPath = plugins.path.join(__dirname, 'tsconfig.json');
|
|||||||
const outputPath = plugins.path.join(__dirname, 'docs');
|
const outputPath = plugins.path.join(__dirname, 'docs');
|
||||||
|
|
||||||
await plugins.smartshellInstance.exec(
|
await plugins.smartshellInstance.exec(
|
||||||
`typedoc --tsconfig ${tsconfigPath} --out ${outputPath} index.ts`
|
`typedoc --tsconfig ${tsconfigPath} --out ${outputPath} index.ts`,
|
||||||
);
|
);
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -243,7 +244,7 @@ import * as plugins from './plugins';
|
|||||||
|
|
||||||
export const packageDir = plugins.path.join(
|
export const packageDir = plugins.path.join(
|
||||||
plugins.smartpath.get.dirnameFromImportMetaUrl(import.meta.url),
|
plugins.smartpath.get.dirnameFromImportMetaUrl(import.meta.url),
|
||||||
'../'
|
'../',
|
||||||
);
|
);
|
||||||
export const cwd = process.cwd();
|
export const cwd = process.cwd();
|
||||||
export const binDir = plugins.path.join(packageDir, './node_modules/.bin');
|
export const binDir = plugins.path.join(packageDir, './node_modules/.bin');
|
||||||
@ -273,7 +274,7 @@ import { AiDoc } from './classes.aidoc';
|
|||||||
export const run = async () => {
|
export const run = async () => {
|
||||||
const tsdocCli = new plugins.smartcli.Smartcli();
|
const tsdocCli = new plugins.smartcli.Smartcli();
|
||||||
|
|
||||||
tsdocCli.standardCommand().subscribe(async argvArg => {
|
tsdocCli.standardCommand().subscribe(async (argvArg) => {
|
||||||
switch (true) {
|
switch (true) {
|
||||||
case await TypeDoc.isTypeDocDir(paths.cwd):
|
case await TypeDoc.isTypeDocDir(paths.cwd):
|
||||||
tsdocCli.triggerCommand('typedoc', argvArg);
|
tsdocCli.triggerCommand('typedoc', argvArg);
|
||||||
@ -283,14 +284,14 @@ export const run = async () => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
tsdocCli.addCommand('typedoc').subscribe(async argvArg => {
|
tsdocCli.addCommand('typedoc').subscribe(async (argvArg) => {
|
||||||
const typeDocInstance = new TypeDoc(paths.cwd);
|
const typeDocInstance = new TypeDoc(paths.cwd);
|
||||||
await typeDocInstance.compile({
|
await typeDocInstance.compile({
|
||||||
publicSubdir: argvArg.publicSubdir
|
publicSubdir: argvArg.publicSubdir,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
tsdocCli.addCommand('aidoc').subscribe(async argvArg => {
|
tsdocCli.addCommand('aidoc').subscribe(async (argvArg) => {
|
||||||
const aidocInstance = new AiDoc(argvArg);
|
const aidocInstance = new AiDoc(argvArg);
|
||||||
await aidocInstance.start();
|
await aidocInstance.start();
|
||||||
await aidocInstance.buildReadme(paths.cwd);
|
await aidocInstance.buildReadme(paths.cwd);
|
||||||
|
@ -8,20 +8,32 @@ let aidocs: tsdocs.AiDoc;
|
|||||||
|
|
||||||
tap.test('should create an AIdocs class', async () => {
|
tap.test('should create an AIdocs class', async () => {
|
||||||
aidocs = new tsdocs.AiDoc({
|
aidocs = new tsdocs.AiDoc({
|
||||||
'OPENAI_TOKEN': await testQenv.getEnvVarOnDemand('OPENAI_TOKEN')
|
OPENAI_TOKEN: await testQenv.getEnvVarOnDemand('OPENAI_TOKEN'),
|
||||||
});
|
});
|
||||||
expect(aidocs).toBeInstanceOf(tsdocs.AiDoc);
|
expect(aidocs).toBeInstanceOf(tsdocs.AiDoc);
|
||||||
});
|
});
|
||||||
|
|
||||||
tap.test('should start AIdocs', async () => {
|
tap.test('should start AIdocs', async () => {
|
||||||
await aidocs.start();
|
await aidocs.start();
|
||||||
|
});
|
||||||
|
|
||||||
|
tap.skip.test('should start AIdocs', async () => {
|
||||||
await aidocs.buildReadme('./');
|
await aidocs.buildReadme('./');
|
||||||
})
|
});
|
||||||
|
|
||||||
tap.test('should start AIdocs', async () => {
|
tap.skip.test('should start AIdocs', async () => {
|
||||||
await aidocs.start();
|
|
||||||
await aidocs.buildDescription('./');
|
await aidocs.buildDescription('./');
|
||||||
})
|
});
|
||||||
|
|
||||||
|
tap.test('should build commit object', async () => {
|
||||||
|
const commitObject = await aidocs.buildNextCommitObject('./');
|
||||||
|
console.log(commitObject);
|
||||||
|
expect(commitObject).not.toBeUndefined();
|
||||||
|
expect(commitObject).toHaveProperty('recommendedNextVersion');
|
||||||
|
expect(commitObject).toHaveProperty('recommendedNextVersionLevel');
|
||||||
|
expect(commitObject).toHaveProperty('recommendedNextVersionScope');
|
||||||
|
expect(commitObject).toHaveProperty('recommendedNextVersionMessage');
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
tap.start();
|
tap.start();
|
@ -1,8 +1,8 @@
|
|||||||
/**
|
/**
|
||||||
* autocreated commitinfo by @pushrocks/commitinfo
|
* autocreated commitinfo by @push.rocks/commitinfo
|
||||||
*/
|
*/
|
||||||
export const commitinfo = {
|
export const commitinfo = {
|
||||||
name: '@git.zone/tsdoc',
|
name: '@git.zone/tsdoc',
|
||||||
version: '1.1.29',
|
version: '1.3.1',
|
||||||
description: 'An advanced TypeScript documentation tool using AI to generate and enhance documentation for TypeScript projects.'
|
description: 'An advanced TypeScript documentation tool using AI to generate and enhance documentation for TypeScript projects.'
|
||||||
}
|
}
|
||||||
|
121
ts/aidocs_classes/commit.ts
Normal file
121
ts/aidocs_classes/commit.ts
Normal file
@ -0,0 +1,121 @@
|
|||||||
|
import * as plugins from '../plugins.js';
|
||||||
|
import { AiDoc } from '../classes.aidoc.js';
|
||||||
|
import { ProjectContext } from './projectcontext.js';
|
||||||
|
|
||||||
|
export interface INextCommitObject {
|
||||||
|
recommendedNextVersionLevel: 'fix' | 'feat' | 'BREAKING CHANGE'; // the recommended next version level of the project
|
||||||
|
recommendedNextVersionScope: string; // the recommended scope name of the next version, like "core" or "cli", or specific class names.
|
||||||
|
recommendedNextVersionMessage: string; // the commit message. Don't put fix() feat() or BREAKING CHANGE in the message. Please just the message itself.
|
||||||
|
recommendedNextVersionDetails: string[]; // detailed bullet points for the changelog
|
||||||
|
recommendedNextVersion: string; // the recommended next version of the project, x.x.x
|
||||||
|
changelog?: string; // the changelog for the next version
|
||||||
|
}
|
||||||
|
|
||||||
|
export class Commit {
|
||||||
|
private aiDocsRef: AiDoc;
|
||||||
|
private projectDir: string;
|
||||||
|
|
||||||
|
constructor(aiDocsRef: AiDoc, projectDirArg: string) {
|
||||||
|
this.aiDocsRef = aiDocsRef;
|
||||||
|
this.projectDir = projectDirArg;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async buildNextCommitObject(): Promise<INextCommitObject> {
|
||||||
|
const smartgitInstance = new plugins.smartgit.Smartgit();
|
||||||
|
await smartgitInstance.init();
|
||||||
|
const gitRepo = await plugins.smartgit.GitRepo.fromOpeningRepoDir(
|
||||||
|
smartgitInstance,
|
||||||
|
this.projectDir
|
||||||
|
);
|
||||||
|
const diffString = await gitRepo.getUncommittedDiff();
|
||||||
|
const projectContext = new ProjectContext(this.projectDir);
|
||||||
|
let contextString = await projectContext.update();
|
||||||
|
contextString = `
|
||||||
|
${contextString}
|
||||||
|
|
||||||
|
Below is the diff of the uncommitted changes. If nothing is changed, there are no changes:
|
||||||
|
|
||||||
|
${diffString || 'No changes.'}
|
||||||
|
`;
|
||||||
|
|
||||||
|
let result = await this.aiDocsRef.openaiInstance.chat({
|
||||||
|
systemMessage: `
|
||||||
|
You create a commit message for a git commit.
|
||||||
|
The commit message should be based on the files in the project.
|
||||||
|
You should not include any licensing information.
|
||||||
|
You should not include any personal information.
|
||||||
|
|
||||||
|
Important: Answer only in valid JSON.
|
||||||
|
|
||||||
|
Your answer should be parseable with JSON.parse() without modifying anything.
|
||||||
|
|
||||||
|
Here is the structure of the JSON you should return:
|
||||||
|
|
||||||
|
interface {
|
||||||
|
recommendedNextVersionLevel: 'fix' | 'feat' | 'BREAKING CHANGE'; // the recommended next version level of the project
|
||||||
|
recommendedNextVersionScope: string; // the recommended scope name of the next version, like "core" or "cli", or specific class names.
|
||||||
|
recommendedNextVersionMessage: string; // the commit message. Don't put fix() feat() or BREAKING CHANGE in the message. Please just the message itself.
|
||||||
|
recommendedNextVersionDetails: string[]; // detailed bullet points for the changelog
|
||||||
|
recommendedNextVersion: string; // the recommended next version of the project, x.x.x
|
||||||
|
}
|
||||||
|
|
||||||
|
You are being given the files of the project. You should use them to create the commit message.
|
||||||
|
Also you are given a diff
|
||||||
|
|
||||||
|
`,
|
||||||
|
messageHistory: [],
|
||||||
|
userMessage: contextString,
|
||||||
|
});
|
||||||
|
|
||||||
|
// console.log(result.message);
|
||||||
|
const resultObject: INextCommitObject = JSON.parse(
|
||||||
|
result.message.replace('```json', '').replace('```', '')
|
||||||
|
);
|
||||||
|
|
||||||
|
// lets build the changelog based on that
|
||||||
|
const commitMessages = await gitRepo.getAllCommitMessages();
|
||||||
|
const previousChangelogPath = plugins.path.join(this.projectDir, 'changelog.md');
|
||||||
|
let previousChangelog: plugins.smartfile.SmartFile;
|
||||||
|
if (await plugins.smartfile.fs.fileExists(previousChangelogPath)) {
|
||||||
|
previousChangelog = await plugins.smartfile.SmartFile.fromFilePath(previousChangelogPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!previousChangelog) {
|
||||||
|
let result2 = await this.aiDocsRef.openaiInstance.chat({
|
||||||
|
messageHistory: [],
|
||||||
|
systemMessage: `
|
||||||
|
You are building a changelog.md file for the project.
|
||||||
|
Omit commits and versions that lack relevant changes.
|
||||||
|
|
||||||
|
A changelog entry should look like this:
|
||||||
|
|
||||||
|
## yyyy-mm-dd - x.x.x - scope here
|
||||||
|
main descriptiom here
|
||||||
|
- detailed bullet points follow
|
||||||
|
|
||||||
|
You are given:
|
||||||
|
* the commit messages of the project
|
||||||
|
|
||||||
|
Only return the changelog file, so it can be written directly to changelog.md`,
|
||||||
|
userMessage: `
|
||||||
|
Here are the commit messages:
|
||||||
|
|
||||||
|
${commitMessages.join('\n')}
|
||||||
|
`,
|
||||||
|
});
|
||||||
|
|
||||||
|
previousChangelog = await plugins.smartfile.SmartFile.fromString(previousChangelogPath, result2.message, 'utf8');
|
||||||
|
}
|
||||||
|
|
||||||
|
let oldChangelog = previousChangelog.contents.toString().replace('# Changelog\n\n', '');
|
||||||
|
let newDateString = new plugins.smarttime.ExtendedDate().exportToEuropeanDate();
|
||||||
|
let newChangelog = `# Changelog\n\n${
|
||||||
|
`## ${newDateString} - {{nextVersion}} - {{nextVersionScope}}
|
||||||
|
{{nextVersionMessage}}
|
||||||
|
{{nextVersionDetails}}
|
||||||
|
`}\n\n${oldChangelog}\n`;
|
||||||
|
resultObject.changelog = newChangelog;
|
||||||
|
|
||||||
|
return resultObject;
|
||||||
|
}
|
||||||
|
}
|
@ -45,7 +45,7 @@ Don't wrap the JSON in three ticks json!!!
|
|||||||
|
|
||||||
console.log(result.message);
|
console.log(result.message);
|
||||||
const resultObject: IDescriptionInterface = JSON.parse(
|
const resultObject: IDescriptionInterface = JSON.parse(
|
||||||
result.message.replace('```json', '').replace('```', '')
|
result.message.replace('```json', '').replace('```', ''),
|
||||||
);
|
);
|
||||||
|
|
||||||
const npmextraJson = (await projectContext.gatherFiles()).smartfilesNpmextraJSON;
|
const npmextraJson = (await projectContext.gatherFiles()).smartfilesNpmextraJSON;
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
export * from './commit.js';
|
||||||
export * from './description.js';
|
export * from './description.js';
|
||||||
export * from './projectcontext.js';
|
export * from './projectcontext.js';
|
||||||
export * from './readme.js';
|
export * from './readme.js';
|
||||||
|
@ -13,28 +13,28 @@ export class ProjectContext {
|
|||||||
public async gatherFiles() {
|
public async gatherFiles() {
|
||||||
const smartfilePackageJSON = await plugins.smartfile.SmartFile.fromFilePath(
|
const smartfilePackageJSON = await plugins.smartfile.SmartFile.fromFilePath(
|
||||||
plugins.path.join(this.projectDir, 'package.json'),
|
plugins.path.join(this.projectDir, 'package.json'),
|
||||||
this.projectDir
|
this.projectDir,
|
||||||
);
|
);
|
||||||
const smartfilesReadme = await plugins.smartfile.SmartFile.fromFilePath(
|
const smartfilesReadme = await plugins.smartfile.SmartFile.fromFilePath(
|
||||||
plugins.path.join(this.projectDir, 'readme.md'),
|
plugins.path.join(this.projectDir, 'readme.md'),
|
||||||
this.projectDir
|
this.projectDir,
|
||||||
);
|
);
|
||||||
|
|
||||||
const smartfilesReadmeHints = await plugins.smartfile.SmartFile.fromFilePath(
|
const smartfilesReadmeHints = await plugins.smartfile.SmartFile.fromFilePath(
|
||||||
plugins.path.join(this.projectDir, 'readme.hints.md'),
|
plugins.path.join(this.projectDir, 'readme.hints.md'),
|
||||||
this.projectDir
|
this.projectDir,
|
||||||
);
|
);
|
||||||
const smartfilesNpmextraJSON = await plugins.smartfile.SmartFile.fromFilePath(
|
const smartfilesNpmextraJSON = await plugins.smartfile.SmartFile.fromFilePath(
|
||||||
plugins.path.join(this.projectDir, 'npmextra.json'),
|
plugins.path.join(this.projectDir, 'npmextra.json'),
|
||||||
this.projectDir
|
this.projectDir,
|
||||||
);
|
);
|
||||||
const smartfilesMod = await plugins.smartfile.fs.fileTreeToObject(
|
const smartfilesMod = await plugins.smartfile.fs.fileTreeToObject(
|
||||||
this.projectDir,
|
this.projectDir,
|
||||||
'ts*/**/*.ts'
|
'ts*/**/*.ts',
|
||||||
);
|
);
|
||||||
const smartfilesTest = await plugins.smartfile.fs.fileTreeToObject(
|
const smartfilesTest = await plugins.smartfile.fs.fileTreeToObject(
|
||||||
this.projectDir,
|
this.projectDir,
|
||||||
'test/**/*.ts'
|
'test/**/*.ts',
|
||||||
);
|
);
|
||||||
return {
|
return {
|
||||||
smartfilePackageJSON,
|
smartfilePackageJSON,
|
||||||
@ -47,10 +47,10 @@ export class ProjectContext {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public async convertFilesToContext(filesArg: plugins.smartfile.SmartFile[]) {
|
public async convertFilesToContext(filesArg: plugins.smartfile.SmartFile[]) {
|
||||||
console.log(`Using the following files for the documentation:`)
|
console.log(`Using the following files for the documentation:`);
|
||||||
filesArg.map(fileArg => {
|
filesArg.map((fileArg) => {
|
||||||
console.log(` -> ${fileArg.relative}`);
|
console.log(` -> ${fileArg.relative}`);
|
||||||
})
|
});
|
||||||
return filesArg
|
return filesArg
|
||||||
.map((smartfile) => {
|
.map((smartfile) => {
|
||||||
return `
|
return `
|
||||||
|
@ -3,7 +3,6 @@ import * as plugins from '../plugins.js';
|
|||||||
import { ProjectContext } from './projectcontext.js';
|
import { ProjectContext } from './projectcontext.js';
|
||||||
|
|
||||||
export class Readme {
|
export class Readme {
|
||||||
|
|
||||||
// INSTANCE
|
// INSTANCE
|
||||||
private aiDocsRef: AiDoc;
|
private aiDocsRef: AiDoc;
|
||||||
private projectDir: string;
|
private projectDir: string;
|
||||||
@ -21,8 +20,10 @@ export class Readme {
|
|||||||
const contextString = await projectContext.update();
|
const contextString = await projectContext.update();
|
||||||
|
|
||||||
// lets first check legal before introducung any cost
|
// lets first check legal before introducung any cost
|
||||||
const npmExtraJson = JSON.parse(((await projectContext.gatherFiles()).smartfilesNpmextraJSON).contents.toString());
|
const npmExtraJson = JSON.parse(
|
||||||
const legalInfo = npmExtraJson?.tsdoc?.legal
|
(await projectContext.gatherFiles()).smartfilesNpmextraJSON.contents.toString(),
|
||||||
|
);
|
||||||
|
const legalInfo = npmExtraJson?.tsdoc?.legal;
|
||||||
if (!legalInfo) {
|
if (!legalInfo) {
|
||||||
const error = new Error(`No legal information found in npmextra.json`);
|
const error = new Error(`No legal information found in npmextra.json`);
|
||||||
console.log(error);
|
console.log(error);
|
||||||
@ -68,11 +69,8 @@ The Readme should follow the following template:
|
|||||||
userMessage: contextString,
|
userMessage: contextString,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
finalReadmeString += result.message + '\n' + legalInfo;
|
finalReadmeString += result.message + '\n' + legalInfo;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
console.log(`\n======================\n`);
|
console.log(`\n======================\n`);
|
||||||
console.log(result.message);
|
console.log(result.message);
|
||||||
console.log(`\n======================\n`);
|
console.log(`\n======================\n`);
|
||||||
|
@ -7,7 +7,7 @@ export class AiDoc {
|
|||||||
|
|
||||||
public npmextraKV: plugins.npmextra.KeyValueStore;
|
public npmextraKV: plugins.npmextra.KeyValueStore;
|
||||||
public qenvInstance: plugins.qenv.Qenv;
|
public qenvInstance: plugins.qenv.Qenv;
|
||||||
public smartinteractInstance: plugins.smartinteract.SmartInteract;
|
public aidocInteract: plugins.smartinteract.SmartInteract;
|
||||||
public openaiInstance: plugins.smartai.OpenAiProvider;
|
public openaiInstance: plugins.smartai.OpenAiProvider;
|
||||||
|
|
||||||
argvArg: any;
|
argvArg: any;
|
||||||
@ -33,7 +33,7 @@ export class AiDoc {
|
|||||||
|
|
||||||
public async start() {
|
public async start() {
|
||||||
// lets care about prerequisites
|
// lets care about prerequisites
|
||||||
this.smartinteractInstance = new plugins.smartinteract.SmartInteract();
|
this.aidocInteract = new plugins.smartinteract.SmartInteract();
|
||||||
this.qenvInstance = new plugins.qenv.Qenv();
|
this.qenvInstance = new plugins.qenv.Qenv();
|
||||||
if (!(await this.qenvInstance.getEnvVarOnDemand('OPENAI_TOKEN'))) {
|
if (!(await this.qenvInstance.getEnvVarOnDemand('OPENAI_TOKEN'))) {
|
||||||
this.npmextraKV = new plugins.npmextra.KeyValueStore({
|
this.npmextraKV = new plugins.npmextra.KeyValueStore({
|
||||||
@ -51,9 +51,9 @@ export class AiDoc {
|
|||||||
// lets try smartinteract
|
// lets try smartinteract
|
||||||
// wait for a second until OpenAI fixes punycode problem...
|
// wait for a second until OpenAI fixes punycode problem...
|
||||||
await plugins.smartdelay.delayFor(1000);
|
await plugins.smartdelay.delayFor(1000);
|
||||||
const answerObject = await this.smartinteractInstance.askQuestion({
|
const answerObject = await this.aidocInteract.askQuestion({
|
||||||
type: 'input',
|
type: 'input',
|
||||||
message: `Please provide your OpenAI token`,
|
message: `Please provide your OpenAI token. This will be persisted in your home directory.`,
|
||||||
name: 'OPENAI_TOKEN',
|
name: 'OPENAI_TOKEN',
|
||||||
default: '',
|
default: '',
|
||||||
});
|
});
|
||||||
@ -84,4 +84,14 @@ export class AiDoc {
|
|||||||
const descriptionInstance = new aiDocsClasses.Description(this, projectDirArg);
|
const descriptionInstance = new aiDocsClasses.Description(this, projectDirArg);
|
||||||
return await descriptionInstance.build();
|
return await descriptionInstance.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async buildNextCommitObject(projectDirArg: string) {
|
||||||
|
const commitInstance = new aiDocsClasses.Commit(this, projectDirArg);
|
||||||
|
return await commitInstance.buildNextCommitObject();
|
||||||
|
}
|
||||||
|
|
||||||
|
public async getProjectContext(projectDirArg: string) {
|
||||||
|
const projectContextInstance = new aiDocsClasses.ProjectContext(projectDirArg);
|
||||||
|
return await projectContextInstance.gatherFiles();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,15 +20,15 @@ export class TypeDoc {
|
|||||||
|
|
||||||
public async compile(options?: { publicSubdir?: string }) {
|
public async compile(options?: { publicSubdir?: string }) {
|
||||||
const data = {
|
const data = {
|
||||||
"compilerOptions": {
|
compilerOptions: {
|
||||||
"experimentalDecorators": true,
|
experimentalDecorators: true,
|
||||||
"useDefineForClassFields": false,
|
useDefineForClassFields: false,
|
||||||
"target": "ES2022",
|
target: 'ES2022',
|
||||||
"module": "NodeNext",
|
module: 'NodeNext',
|
||||||
"moduleResolution": "NodeNext",
|
moduleResolution: 'NodeNext',
|
||||||
"esModuleInterop": true,
|
esModuleInterop: true,
|
||||||
"verbatimModuleSyntax": true,
|
verbatimModuleSyntax: true,
|
||||||
"skipLibCheck": true,
|
skipLibCheck: true,
|
||||||
},
|
},
|
||||||
include: [],
|
include: [],
|
||||||
};
|
};
|
||||||
@ -51,7 +51,7 @@ export class TypeDoc {
|
|||||||
targetDir = plugins.path.join(targetDir, options.publicSubdir);
|
targetDir = plugins.path.join(targetDir, options.publicSubdir);
|
||||||
}
|
}
|
||||||
await this.smartshellInstance.exec(
|
await this.smartshellInstance.exec(
|
||||||
`typedoc --tsconfig ${paths.tsconfigFile} --out ${targetDir} ${startDirectory}/index.ts`
|
`typedoc --tsconfig ${paths.tsconfigFile} --out ${targetDir} ${startDirectory}/index.ts`,
|
||||||
);
|
);
|
||||||
plugins.smartfile.fs.remove(paths.tsconfigFile);
|
plugins.smartfile.fs.remove(paths.tsconfigFile);
|
||||||
}
|
}
|
||||||
|
@ -36,7 +36,7 @@ export const run = async () => {
|
|||||||
logger.log('info', `Generating new keywords...`);
|
logger.log('info', `Generating new keywords...`);
|
||||||
logger.log('info', `This may take some time...`);
|
logger.log('info', `This may take some time...`);
|
||||||
aidocInstance.buildDescription(paths.cwd);
|
aidocInstance.buildDescription(paths.cwd);
|
||||||
})
|
});
|
||||||
|
|
||||||
tsdocCli.addCommand('test').subscribe((argvArg) => {
|
tsdocCli.addCommand('test').subscribe((argvArg) => {
|
||||||
tsdocCli.triggerCommand('typedoc', argvArg);
|
tsdocCli.triggerCommand('typedoc', argvArg);
|
||||||
|
@ -1,15 +1,6 @@
|
|||||||
|
import { commitinfo } from './00_commitinfo_data.js';
|
||||||
import * as plugins from './plugins.js';
|
import * as plugins from './plugins.js';
|
||||||
|
|
||||||
export const logger = new plugins.smartlog.Smartlog({
|
export const logger = plugins.smartlog.Smartlog.createForCommitinfo(commitinfo);
|
||||||
logContext: {
|
|
||||||
company: 'Some Company',
|
|
||||||
companyunit: 'Some CompanyUnit',
|
|
||||||
containerName: 'Some Containername',
|
|
||||||
environment: 'local',
|
|
||||||
runtime: 'node',
|
|
||||||
zone: 'gitzone',
|
|
||||||
},
|
|
||||||
minimumLogLevel: 'silly',
|
|
||||||
});
|
|
||||||
|
|
||||||
logger.addLogDestination(new plugins.smartlogDestinationLocal.DestinationLocal());
|
logger.addLogDestination(new plugins.smartlogDestinationLocal.DestinationLocal());
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
import * as plugins from './plugins.js';
|
import * as plugins from './plugins.js';
|
||||||
|
|
||||||
// dirs
|
// dirs
|
||||||
export const packageDir = plugins.path.join(plugins.smartpath.get.dirnameFromImportMetaUrl(import.meta.url), '../');
|
export const packageDir = plugins.path.join(
|
||||||
|
plugins.smartpath.get.dirnameFromImportMetaUrl(import.meta.url),
|
||||||
|
'../',
|
||||||
|
);
|
||||||
export const cwd = process.cwd();
|
export const cwd = process.cwd();
|
||||||
export const binDir = plugins.path.join(packageDir, './node_modules/.bin');
|
export const binDir = plugins.path.join(packageDir, './node_modules/.bin');
|
||||||
export const assetsDir = plugins.path.join(packageDir, './assets');
|
export const assetsDir = plugins.path.join(packageDir, './assets');
|
||||||
|
@ -10,13 +10,29 @@ import * as smartai from '@push.rocks/smartai';
|
|||||||
import * as smartcli from '@push.rocks/smartcli';
|
import * as smartcli from '@push.rocks/smartcli';
|
||||||
import * as smartdelay from '@push.rocks/smartdelay';
|
import * as smartdelay from '@push.rocks/smartdelay';
|
||||||
import * as smartfile from '@push.rocks/smartfile';
|
import * as smartfile from '@push.rocks/smartfile';
|
||||||
|
import * as smartgit from '@push.rocks/smartgit';
|
||||||
import * as smartinteract from '@push.rocks/smartinteract';
|
import * as smartinteract from '@push.rocks/smartinteract';
|
||||||
import * as smartlog from '@push.rocks/smartlog';
|
import * as smartlog from '@push.rocks/smartlog';
|
||||||
import * as smartlogDestinationLocal from '@push.rocks/smartlog-destination-local';
|
import * as smartlogDestinationLocal from '@push.rocks/smartlog-destination-local';
|
||||||
import * as smartpath from '@push.rocks/smartpath';
|
import * as smartpath from '@push.rocks/smartpath';
|
||||||
import * as smartshell from '@push.rocks/smartshell';
|
import * as smartshell from '@push.rocks/smartshell';
|
||||||
|
import * as smarttime from '@push.rocks/smarttime';
|
||||||
|
|
||||||
export { npmextra, qenv, smartai, smartcli, smartdelay, smartfile, smartinteract, smartlog, smartlogDestinationLocal, smartpath, smartshell };
|
export {
|
||||||
|
npmextra,
|
||||||
|
qenv,
|
||||||
|
smartai,
|
||||||
|
smartcli,
|
||||||
|
smartdelay,
|
||||||
|
smartfile,
|
||||||
|
smartgit,
|
||||||
|
smartinteract,
|
||||||
|
smartlog,
|
||||||
|
smartlogDestinationLocal,
|
||||||
|
smartpath,
|
||||||
|
smartshell,
|
||||||
|
smarttime,
|
||||||
|
};
|
||||||
|
|
||||||
// third party scope
|
// third party scope
|
||||||
import * as typedoc from 'typedoc';
|
import * as typedoc from 'typedoc';
|
||||||
|
Reference in New Issue
Block a user