@qelos/aidev 0.7.3 → 0.7.5
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/.env.aidev.example +105 -105
- package/CONTRIBUTING.md +78 -78
- package/LICENSE +21 -21
- package/README.md +755 -755
- package/dist/cli.js +0 -0
- package/dist/commands/help.js +80 -80
- package/dist/commands/init.js +105 -105
- package/dist/commands/run.d.ts +7 -0
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +186 -159
- package/dist/commands/run.js.map +1 -1
- package/dist/github.js +27 -27
- package/dist/providers/linear.d.ts.map +1 -1
- package/dist/providers/linear.js +151 -116
- package/dist/providers/linear.js.map +1 -1
- package/dist/providers/monday.js +45 -45
- package/package.json +51 -51
- package/scripts/run-tests.cjs +18 -18
- package/.aidev/assets/86c8yjxrr/9ea11c36-311c-4022-889c-1bb0915122dc.jpg-40e6939e3b68e864260f7ae7e85bd623_exif.jpg +0 -0
- package/.aidev/assets/86c9n1mkf/65d079a2-dc39-4c4e-9ea9-964d37e0402c.jpg-a639447a10296e31cd4c85d521e9705e_exif.jpg +0 -0
- package/aidev.tasks.json +0 -1
- package/dist/autoCompress.d.ts +0 -54
- package/dist/autoCompress.d.ts.map +0 -1
- package/dist/autoCompress.js +0 -300
- package/dist/autoCompress.js.map +0 -1
package/.env.aidev.example
CHANGED
|
@@ -1,105 +1,105 @@
|
|
|
1
|
-
# AIDEV_ENV_EXTEND: path to a shared/global env file loaded as the base for this file.
|
|
2
|
-
# Values in this file override the global one. Useful for sharing API keys across projects.
|
|
3
|
-
# Can also be set as a shell export (e.g. in ~/.zshrc) instead.
|
|
4
|
-
# AIDEV_ENV_EXTEND=~/.aidev.global
|
|
5
|
-
|
|
6
|
-
# PROVIDER: clickup | jira | linear | local | monday | notion | trello
|
|
7
|
-
PROVIDER=clickup
|
|
8
|
-
|
|
9
|
-
# ── ClickUp (when PROVIDER=clickup) ──────────────────────────
|
|
10
|
-
CLICKUP_API_KEY=
|
|
11
|
-
CLICKUP_TEAM_ID=
|
|
12
|
-
# Set to * to match all tasks (useful when aidev has its own dedicated user)
|
|
13
|
-
CLICKUP_TAG=
|
|
14
|
-
CLICKUP_PENDING_STATUS=pending
|
|
15
|
-
CLICKUP_IN_REVIEW_STATUS=review
|
|
16
|
-
|
|
17
|
-
# ── Jira (when PROVIDER=jira) ─────────────────────────────────
|
|
18
|
-
# JIRA_BASE_URL=https://mycompany.atlassian.net
|
|
19
|
-
# JIRA_EMAIL=you@example.com
|
|
20
|
-
# JIRA_API_TOKEN=
|
|
21
|
-
# JIRA_PROJECT=PROJ
|
|
22
|
-
# JIRA_LABEL= # Set to * to match all issues in the project
|
|
23
|
-
# JIRA_PENDING_STATUS=To Do
|
|
24
|
-
# JIRA_IN_REVIEW_STATUS=In Review
|
|
25
|
-
|
|
26
|
-
# ── Linear (when PROVIDER=linear) ──────────────────────────────
|
|
27
|
-
# LINEAR_API_KEY= # Personal API key from Linear Settings → API
|
|
28
|
-
# LINEAR_TEAM_ID= # Team UUID from workspace
|
|
29
|
-
# Linear calls them "labels" — same concept as CLICKUP_TAG / JIRA_LABEL.
|
|
30
|
-
# Tasks created via aidev.tasks.json with `tags` are mapped to Linear labels;
|
|
31
|
-
# missing labels are created on the team automatically.
|
|
32
|
-
# LINEAR_LABEL= # Set to * to match all issues in the team
|
|
33
|
-
# Defaults map to Linear's standard workflow state names:
|
|
34
|
-
# Backlog | Todo | In Progress | In Review | Done. If your team renamed
|
|
35
|
-
# these (e.g. "Triage" instead of "Backlog"), aidev will also fall back
|
|
36
|
-
# to matching by Linear's underlying state type.
|
|
37
|
-
# LINEAR_PENDING_STATUS=Backlog
|
|
38
|
-
# LINEAR_IN_REVIEW_STATUS=In Review
|
|
39
|
-
|
|
40
|
-
# ── Monday.com (when PROVIDER=monday) ──────────────────────────
|
|
41
|
-
# MONDAY_API_TOKEN=
|
|
42
|
-
# MONDAY_BOARD_ID=
|
|
43
|
-
# MONDAY_STATUS_COLUMN_ID=status
|
|
44
|
-
# MONDAY_GROUP_ID=
|
|
45
|
-
# Use CLICKUP_PENDING_STATUS / CLICKUP_IN_REVIEW_STATUS for status labels (e.g. Working on it, Done)
|
|
46
|
-
|
|
47
|
-
# ── Notion (when PROVIDER=notion) ──────────────────────────────
|
|
48
|
-
# NOTION_API_KEY= # Integration token from Notion → Settings → My integrations
|
|
49
|
-
# NOTION_DATABASE_ID= # Database ID from the database URL (32-char hex with optional dashes)
|
|
50
|
-
# NOTION_STATUS_PROPERTY=Status
|
|
51
|
-
# NOTION_PENDING_STATUS=pending
|
|
52
|
-
# NOTION_IN_REVIEW_STATUS=review
|
|
53
|
-
|
|
54
|
-
# ── Trello (when PROVIDER=trello) ───────────────────────────────
|
|
55
|
-
# Developer API key and token from https://trello.com/power-ups/admin (or trello.com/app-key)
|
|
56
|
-
# TRELLO_API_KEY=
|
|
57
|
-
# TRELLO_TOKEN=
|
|
58
|
-
# TRELLO_BOARD_ID= # Short board ID from the board URL
|
|
59
|
-
# TRELLO_LABEL= # Label name on cards to pick up; set * for all cards assigned to the token user
|
|
60
|
-
# List names on the board (must exist): open / pending / in progress / review workflow
|
|
61
|
-
# TRELLO_OPEN_LIST=To Do
|
|
62
|
-
# TRELLO_PENDING_LIST=Blocked
|
|
63
|
-
# TRELLO_IN_PROGRESS_LIST=Doing
|
|
64
|
-
# TRELLO_IN_REVIEW_LIST=In Review
|
|
65
|
-
# TRELLO_OPEN_STATUS=open
|
|
66
|
-
# TRELLO_PENDING_STATUS=pending
|
|
67
|
-
# TRELLO_IN_REVIEW_STATUS=review
|
|
68
|
-
|
|
69
|
-
ASSIGNEE_TAG=
|
|
70
|
-
|
|
71
|
-
# THINKING_TAG: tasks with this tag are analyzed and broken into sub-tasks before execution (optional)
|
|
72
|
-
THINKING_TAG=
|
|
73
|
-
GIT_REMOTE=origin
|
|
74
|
-
GITHUB_BASE_BRANCH=main
|
|
75
|
-
GITHUB_REPO=
|
|
76
|
-
|
|
77
|
-
# Agents to use, in fallback order (comma-separated: antigravity, claude, codex, cursor, windsurf)
|
|
78
|
-
AGENTS=claude,cursor
|
|
79
|
-
|
|
80
|
-
# DEV_NOTES_MODE: smart (only ask when unclear) | always (ask before every task)
|
|
81
|
-
DEV_NOTES_MODE=smart
|
|
82
|
-
|
|
83
|
-
# AIDEV_COMMENT_PREFIX: custom prefix for aidev comments in task providers (default: [aidev])
|
|
84
|
-
# AIDEV_COMMENT_PREFIX=[mybot]
|
|
85
|
-
|
|
86
|
-
# PR_SIGNATURE: custom signature line appended to PR body (default: "Automated PR by aidev.")
|
|
87
|
-
# PR_SIGNATURE=Automated PR by my-team-bot
|
|
88
|
-
|
|
89
|
-
# AIDEV_HOOKS_PATH: optional path to .ts or .js hooks module (relative to project cwd or absolute).
|
|
90
|
-
# aidev init creates .aidev/aidev.hooks.ts and sets this by default.
|
|
91
|
-
# AIDEV_HOOKS_PATH=.aidev/aidev.hooks.ts
|
|
92
|
-
|
|
93
|
-
# AIDEV_AUTO_COMPRESS: when the prompt grows past AIDEV_COMPRESS_THRESHOLD chars,
|
|
94
|
-
# summarize older comments and keep only the latest verbatim. Default: true.
|
|
95
|
-
# Set to false / 0 / no to opt out.
|
|
96
|
-
# AIDEV_AUTO_COMPRESS=true
|
|
97
|
-
|
|
98
|
-
# AIDEV_COMPRESS_THRESHOLD: char-length threshold that triggers compression. Default: 12000.
|
|
99
|
-
# AIDEV_COMPRESS_THRESHOLD=12000
|
|
100
|
-
|
|
101
|
-
# AIDEV_LOG_PATH: path to the aidev log file. Can be absolute, relative (resolved
|
|
102
|
-
# against the project cwd), or start with ~/. Must include the file name, not
|
|
103
|
-
# just a directory. Missing parent directories are created automatically.
|
|
104
|
-
# Default: aidev.log in the project cwd.
|
|
105
|
-
# AIDEV_LOG_PATH=logs/aidev.log
|
|
1
|
+
# AIDEV_ENV_EXTEND: path to a shared/global env file loaded as the base for this file.
|
|
2
|
+
# Values in this file override the global one. Useful for sharing API keys across projects.
|
|
3
|
+
# Can also be set as a shell export (e.g. in ~/.zshrc) instead.
|
|
4
|
+
# AIDEV_ENV_EXTEND=~/.aidev.global
|
|
5
|
+
|
|
6
|
+
# PROVIDER: clickup | jira | linear | local | monday | notion | trello
|
|
7
|
+
PROVIDER=clickup
|
|
8
|
+
|
|
9
|
+
# ── ClickUp (when PROVIDER=clickup) ──────────────────────────
|
|
10
|
+
CLICKUP_API_KEY=
|
|
11
|
+
CLICKUP_TEAM_ID=
|
|
12
|
+
# Set to * to match all tasks (useful when aidev has its own dedicated user)
|
|
13
|
+
CLICKUP_TAG=
|
|
14
|
+
CLICKUP_PENDING_STATUS=pending
|
|
15
|
+
CLICKUP_IN_REVIEW_STATUS=review
|
|
16
|
+
|
|
17
|
+
# ── Jira (when PROVIDER=jira) ─────────────────────────────────
|
|
18
|
+
# JIRA_BASE_URL=https://mycompany.atlassian.net
|
|
19
|
+
# JIRA_EMAIL=you@example.com
|
|
20
|
+
# JIRA_API_TOKEN=
|
|
21
|
+
# JIRA_PROJECT=PROJ
|
|
22
|
+
# JIRA_LABEL= # Set to * to match all issues in the project
|
|
23
|
+
# JIRA_PENDING_STATUS=To Do
|
|
24
|
+
# JIRA_IN_REVIEW_STATUS=In Review
|
|
25
|
+
|
|
26
|
+
# ── Linear (when PROVIDER=linear) ──────────────────────────────
|
|
27
|
+
# LINEAR_API_KEY= # Personal API key from Linear Settings → API
|
|
28
|
+
# LINEAR_TEAM_ID= # Team UUID from workspace
|
|
29
|
+
# Linear calls them "labels" — same concept as CLICKUP_TAG / JIRA_LABEL.
|
|
30
|
+
# Tasks created via aidev.tasks.json with `tags` are mapped to Linear labels;
|
|
31
|
+
# missing labels are created on the team automatically.
|
|
32
|
+
# LINEAR_LABEL= # Set to * to match all issues in the team
|
|
33
|
+
# Defaults map to Linear's standard workflow state names:
|
|
34
|
+
# Backlog | Todo | In Progress | In Review | Done. If your team renamed
|
|
35
|
+
# these (e.g. "Triage" instead of "Backlog"), aidev will also fall back
|
|
36
|
+
# to matching by Linear's underlying state type.
|
|
37
|
+
# LINEAR_PENDING_STATUS=Backlog
|
|
38
|
+
# LINEAR_IN_REVIEW_STATUS=In Review
|
|
39
|
+
|
|
40
|
+
# ── Monday.com (when PROVIDER=monday) ──────────────────────────
|
|
41
|
+
# MONDAY_API_TOKEN=
|
|
42
|
+
# MONDAY_BOARD_ID=
|
|
43
|
+
# MONDAY_STATUS_COLUMN_ID=status
|
|
44
|
+
# MONDAY_GROUP_ID=
|
|
45
|
+
# Use CLICKUP_PENDING_STATUS / CLICKUP_IN_REVIEW_STATUS for status labels (e.g. Working on it, Done)
|
|
46
|
+
|
|
47
|
+
# ── Notion (when PROVIDER=notion) ──────────────────────────────
|
|
48
|
+
# NOTION_API_KEY= # Integration token from Notion → Settings → My integrations
|
|
49
|
+
# NOTION_DATABASE_ID= # Database ID from the database URL (32-char hex with optional dashes)
|
|
50
|
+
# NOTION_STATUS_PROPERTY=Status
|
|
51
|
+
# NOTION_PENDING_STATUS=pending
|
|
52
|
+
# NOTION_IN_REVIEW_STATUS=review
|
|
53
|
+
|
|
54
|
+
# ── Trello (when PROVIDER=trello) ───────────────────────────────
|
|
55
|
+
# Developer API key and token from https://trello.com/power-ups/admin (or trello.com/app-key)
|
|
56
|
+
# TRELLO_API_KEY=
|
|
57
|
+
# TRELLO_TOKEN=
|
|
58
|
+
# TRELLO_BOARD_ID= # Short board ID from the board URL
|
|
59
|
+
# TRELLO_LABEL= # Label name on cards to pick up; set * for all cards assigned to the token user
|
|
60
|
+
# List names on the board (must exist): open / pending / in progress / review workflow
|
|
61
|
+
# TRELLO_OPEN_LIST=To Do
|
|
62
|
+
# TRELLO_PENDING_LIST=Blocked
|
|
63
|
+
# TRELLO_IN_PROGRESS_LIST=Doing
|
|
64
|
+
# TRELLO_IN_REVIEW_LIST=In Review
|
|
65
|
+
# TRELLO_OPEN_STATUS=open
|
|
66
|
+
# TRELLO_PENDING_STATUS=pending
|
|
67
|
+
# TRELLO_IN_REVIEW_STATUS=review
|
|
68
|
+
|
|
69
|
+
ASSIGNEE_TAG=
|
|
70
|
+
|
|
71
|
+
# THINKING_TAG: tasks with this tag are analyzed and broken into sub-tasks before execution (optional)
|
|
72
|
+
THINKING_TAG=
|
|
73
|
+
GIT_REMOTE=origin
|
|
74
|
+
GITHUB_BASE_BRANCH=main
|
|
75
|
+
GITHUB_REPO=
|
|
76
|
+
|
|
77
|
+
# Agents to use, in fallback order (comma-separated: antigravity, claude, codex, cursor, windsurf)
|
|
78
|
+
AGENTS=claude,cursor
|
|
79
|
+
|
|
80
|
+
# DEV_NOTES_MODE: smart (only ask when unclear) | always (ask before every task)
|
|
81
|
+
DEV_NOTES_MODE=smart
|
|
82
|
+
|
|
83
|
+
# AIDEV_COMMENT_PREFIX: custom prefix for aidev comments in task providers (default: [aidev])
|
|
84
|
+
# AIDEV_COMMENT_PREFIX=[mybot]
|
|
85
|
+
|
|
86
|
+
# PR_SIGNATURE: custom signature line appended to PR body (default: "Automated PR by aidev.")
|
|
87
|
+
# PR_SIGNATURE=Automated PR by my-team-bot
|
|
88
|
+
|
|
89
|
+
# AIDEV_HOOKS_PATH: optional path to .ts or .js hooks module (relative to project cwd or absolute).
|
|
90
|
+
# aidev init creates .aidev/aidev.hooks.ts and sets this by default.
|
|
91
|
+
# AIDEV_HOOKS_PATH=.aidev/aidev.hooks.ts
|
|
92
|
+
|
|
93
|
+
# AIDEV_AUTO_COMPRESS: when the prompt grows past AIDEV_COMPRESS_THRESHOLD chars,
|
|
94
|
+
# summarize older comments and keep only the latest verbatim. Default: true.
|
|
95
|
+
# Set to false / 0 / no to opt out.
|
|
96
|
+
# AIDEV_AUTO_COMPRESS=true
|
|
97
|
+
|
|
98
|
+
# AIDEV_COMPRESS_THRESHOLD: char-length threshold that triggers compression. Default: 12000.
|
|
99
|
+
# AIDEV_COMPRESS_THRESHOLD=12000
|
|
100
|
+
|
|
101
|
+
# AIDEV_LOG_PATH: path to the aidev log file. Can be absolute, relative (resolved
|
|
102
|
+
# against the project cwd), or start with ~/. Must include the file name, not
|
|
103
|
+
# just a directory. Missing parent directories are created automatically.
|
|
104
|
+
# Default: aidev.log in the project cwd.
|
|
105
|
+
# AIDEV_LOG_PATH=logs/aidev.log
|
package/CONTRIBUTING.md
CHANGED
|
@@ -1,78 +1,78 @@
|
|
|
1
|
-
# Contributing to aidev
|
|
2
|
-
|
|
3
|
-
Thank you for your interest in contributing!
|
|
4
|
-
|
|
5
|
-
## Getting Started
|
|
6
|
-
|
|
7
|
-
1. Fork the repository
|
|
8
|
-
2. Create a feature branch: `git checkout -b feature/my-feature`
|
|
9
|
-
3. Make your changes
|
|
10
|
-
4. Build and test: `npm install && npm run build`
|
|
11
|
-
5. Open a pull request
|
|
12
|
-
|
|
13
|
-
## Development Setup
|
|
14
|
-
|
|
15
|
-
```bash
|
|
16
|
-
git clone https://github.com/qelos-io/aidev
|
|
17
|
-
cd aidev
|
|
18
|
-
npm install
|
|
19
|
-
npm run dev -- init # uses tsx, no build needed
|
|
20
|
-
npm run dev -- run --help
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
## Adding a New Provider
|
|
24
|
-
|
|
25
|
-
1. Create `src/providers/<name>.ts` implementing the `TaskProvider` interface:
|
|
26
|
-
|
|
27
|
-
```typescript
|
|
28
|
-
import { TaskProvider } from './base';
|
|
29
|
-
import { Task, Comment, Config } from '../types';
|
|
30
|
-
|
|
31
|
-
export class MyProvider implements TaskProvider {
|
|
32
|
-
constructor(config: Config) { ... }
|
|
33
|
-
async fetchTasks(): Promise<Task[]> { ... }
|
|
34
|
-
async postComment(taskId: string, text: string): Promise<void> { ... }
|
|
35
|
-
async getComments(taskId: string): Promise<Comment[]> { ... }
|
|
36
|
-
async updateStatus(taskId: string, status: string): Promise<void> { ... }
|
|
37
|
-
}
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
2. Register it in `src/providers/index.ts`:
|
|
41
|
-
|
|
42
|
-
```typescript
|
|
43
|
-
case 'myprovider':
|
|
44
|
-
return new MyProvider(config);
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
3. Add any new config keys to `src/types.ts` (`Config` interface) and `src/config.ts`.
|
|
48
|
-
|
|
49
|
-
4. Document the new env vars in `.env.aidev.example` and `README.md`.
|
|
50
|
-
|
|
51
|
-
## Adding a New AI Runner
|
|
52
|
-
|
|
53
|
-
1. Create `src/ai/<name>.ts` implementing the `AIRunner` interface:
|
|
54
|
-
|
|
55
|
-
```typescript
|
|
56
|
-
import { AIRunner, AIRunResult } from './base';
|
|
57
|
-
|
|
58
|
-
export class MyRunner implements AIRunner {
|
|
59
|
-
readonly name = 'myrunner';
|
|
60
|
-
isAvailable(): boolean { ... }
|
|
61
|
-
async run(prompt: string, notes?: string): Promise<AIRunResult> { ... }
|
|
62
|
-
}
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
2. Register it in `src/ai/index.ts` and update the `AI_TOOL` logic.
|
|
66
|
-
|
|
67
|
-
## Code Style
|
|
68
|
-
|
|
69
|
-
- TypeScript strict mode
|
|
70
|
-
- No shell string concatenation for subprocess calls — always use array args with `spawnSync`
|
|
71
|
-
- Native `fetch` only — no HTTP library dependencies
|
|
72
|
-
- Keep dependencies minimal
|
|
73
|
-
|
|
74
|
-
## Pull Request Guidelines
|
|
75
|
-
|
|
76
|
-
- One feature/fix per PR
|
|
77
|
-
- Update README.md if you add new config vars or commands
|
|
78
|
-
- Ensure `npm run build` passes before submitting
|
|
1
|
+
# Contributing to aidev
|
|
2
|
+
|
|
3
|
+
Thank you for your interest in contributing!
|
|
4
|
+
|
|
5
|
+
## Getting Started
|
|
6
|
+
|
|
7
|
+
1. Fork the repository
|
|
8
|
+
2. Create a feature branch: `git checkout -b feature/my-feature`
|
|
9
|
+
3. Make your changes
|
|
10
|
+
4. Build and test: `npm install && npm run build`
|
|
11
|
+
5. Open a pull request
|
|
12
|
+
|
|
13
|
+
## Development Setup
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
git clone https://github.com/qelos-io/aidev
|
|
17
|
+
cd aidev
|
|
18
|
+
npm install
|
|
19
|
+
npm run dev -- init # uses tsx, no build needed
|
|
20
|
+
npm run dev -- run --help
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Adding a New Provider
|
|
24
|
+
|
|
25
|
+
1. Create `src/providers/<name>.ts` implementing the `TaskProvider` interface:
|
|
26
|
+
|
|
27
|
+
```typescript
|
|
28
|
+
import { TaskProvider } from './base';
|
|
29
|
+
import { Task, Comment, Config } from '../types';
|
|
30
|
+
|
|
31
|
+
export class MyProvider implements TaskProvider {
|
|
32
|
+
constructor(config: Config) { ... }
|
|
33
|
+
async fetchTasks(): Promise<Task[]> { ... }
|
|
34
|
+
async postComment(taskId: string, text: string): Promise<void> { ... }
|
|
35
|
+
async getComments(taskId: string): Promise<Comment[]> { ... }
|
|
36
|
+
async updateStatus(taskId: string, status: string): Promise<void> { ... }
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
2. Register it in `src/providers/index.ts`:
|
|
41
|
+
|
|
42
|
+
```typescript
|
|
43
|
+
case 'myprovider':
|
|
44
|
+
return new MyProvider(config);
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
3. Add any new config keys to `src/types.ts` (`Config` interface) and `src/config.ts`.
|
|
48
|
+
|
|
49
|
+
4. Document the new env vars in `.env.aidev.example` and `README.md`.
|
|
50
|
+
|
|
51
|
+
## Adding a New AI Runner
|
|
52
|
+
|
|
53
|
+
1. Create `src/ai/<name>.ts` implementing the `AIRunner` interface:
|
|
54
|
+
|
|
55
|
+
```typescript
|
|
56
|
+
import { AIRunner, AIRunResult } from './base';
|
|
57
|
+
|
|
58
|
+
export class MyRunner implements AIRunner {
|
|
59
|
+
readonly name = 'myrunner';
|
|
60
|
+
isAvailable(): boolean { ... }
|
|
61
|
+
async run(prompt: string, notes?: string): Promise<AIRunResult> { ... }
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
2. Register it in `src/ai/index.ts` and update the `AI_TOOL` logic.
|
|
66
|
+
|
|
67
|
+
## Code Style
|
|
68
|
+
|
|
69
|
+
- TypeScript strict mode
|
|
70
|
+
- No shell string concatenation for subprocess calls — always use array args with `spawnSync`
|
|
71
|
+
- Native `fetch` only — no HTTP library dependencies
|
|
72
|
+
- Keep dependencies minimal
|
|
73
|
+
|
|
74
|
+
## Pull Request Guidelines
|
|
75
|
+
|
|
76
|
+
- One feature/fix per PR
|
|
77
|
+
- Update README.md if you add new config vars or commands
|
|
78
|
+
- Ensure `npm run build` passes before submitting
|
package/LICENSE
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2025 aidev contributors
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 aidev contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|