martmull
8edb2c5520
Stop using .env variables to authenticate with cli ( #15461 )
...
- as title, solves our user facing authentication issues using the
twenty-cli
- update twenty-cli version (breaking change from previous PR)
2025-10-30 11:18:25 +00:00
martmull
a6cc80eedd
1751 extensibility twenty sdk v2 use twenty sdk to define a serverless function trigger ( #15347 )
...
This PR adds 2 columns handlerPath and handlerName in serverlessFunction
to locate the entrypoint of a serverless in a codebase
It adds the following decorators in twenty-sdk:
- ServerlessFunction
- DatabaseEventTrigger
- RouteTrigger
- CronTrigger
- ApplicationVariable
It still supports deprecated entity.manifest.jsonc
Overall code needs to be cleaned a little bit, but it should work
properly so you can try to test if the DEVX fits your needs
See updates in hello-world application
```typescript
import axios from 'axios';
import {
DatabaseEventTrigger,
ServerlessFunction,
RouteTrigger,
CronTrigger,
ApplicationVariable,
} from 'twenty-sdk';
@ApplicationVariable({
universalIdentifier: 'dedc53eb-9c12-4fe2-ba86-4a2add19d305',
key: 'TWENTY_API_KEY',
description: 'Twenty API Key',
isSecret: true,
})
@DatabaseEventTrigger({
universalIdentifier: '203f1df3-4a82-4d06-a001-b8cf22a31156',
eventName: 'person.created',
})
@RouteTrigger({
universalIdentifier: 'c9f84c8d-b26d-40d1-95dd-4f834ae5a2c6',
path: '/post-card/create',
httpMethod: 'GET',
isAuthRequired: false,
})
@CronTrigger({
universalIdentifier: 'dd802808-0695-49e1-98c9-d5c9e2704ce2',
pattern: '0 0 1 1 *', // Every year 1st of January
})
@ServerlessFunction({
universalIdentifier: 'e56d363b-0bdc-4d8a-a393-6f0d1c75bdcf',
})
class CreateNewPostCard {
main = async (params: { recipient: string }): Promise<string> => {
const { recipient } = params;
const options = {
method: 'POST',
url: 'http://localhost:3000/rest/postCards ',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${process.env.TWENTY_API_KEY}`,
},
data: { name: recipient ?? 'Unknown' },
};
try {
const { data } = await axios.request(options);
console.log(`New post card to "${recipient}" created`);
return data;
} catch (error) {
console.error(error);
throw error;
}
};
}
export const createNewPostCardHandler = new CreateNewPostCard().main;
```
### [edit] V2
After the v1 proposal, I see that using a class method to define the
serverless function handler is pretty confusing. Lets leave
serverlessFunction configuration decorators on the class, but move the
handler like before. Here is the v2 hello-world serverless function:
```typescript
import axios from 'axios';
import {
DatabaseEventTrigger,
ServerlessFunction,
RouteTrigger,
CronTrigger,
ApplicationVariable,
} from 'twenty-sdk';
@ApplicationVariable({
universalIdentifier: 'dedc53eb-9c12-4fe2-ba86-4a2add19d305',
key: 'TWENTY_API_KEY',
description: 'Twenty API Key',
isSecret: true,
})
@DatabaseEventTrigger({
universalIdentifier: '203f1df3-4a82-4d06-a001-b8cf22a31156',
eventName: 'person.created',
})
@RouteTrigger({
universalIdentifier: 'c9f84c8d-b26d-40d1-95dd-4f834ae5a2c6',
path: '/post-card/create',
httpMethod: 'GET',
isAuthRequired: false,
})
@CronTrigger({
universalIdentifier: 'dd802808-0695-49e1-98c9-d5c9e2704ce2',
pattern: '0 0 1 1 *', // Every year 1st of January
})
@ServerlessFunction({
universalIdentifier: 'e56d363b-0bdc-4d8a-a393-6f0d1c75bdcf',
})
export class ServerlessFunctionDefinition {}
export const main = async (params: { recipient: string }): Promise<string> => {
const { recipient } = params;
const options = {
method: 'POST',
url: 'http://localhost:3000/rest/postCards ',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${process.env.TWENTY_API_KEY}`,
},
data: { name: recipient ?? 'Unknown' },
};
try {
const { data } = await axios.request(options);
console.log(`New post card to "${recipient}" created`);
return data;
} catch (error) {
console.error(error);
throw error;
}
};
```
### [edit] V3
After the v2 proposal, we don't really like decorators on empty classes.
We decided to go with a Vercel approach with a config constant
```typescript
import axios from 'axios';
import { ServerlessFunctionConfig } from 'twenty-sdk';
export const main = async (params: { recipient: string }): Promise<string> => {
const { recipient } = params;
const options = {
method: 'POST',
url: 'http://localhost:3000/rest/postCards ',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${process.env.TWENTY_API_KEY}`,
},
data: { name: recipient ?? 'Unknown' },
};
try {
const { data } = await axios.request(options);
console.log(`New post card to "${recipient}" created`);
return data;
} catch (error) {
console.error(error);
throw error;
}
};
export const config: ServerlessFunctionConfig = {
universalIdentifier: 'e56d363b-0bdc-4d8a-a393-6f0d1c75bdcf',
routeTriggers: [
{
universalIdentifier: 'c9f84c8d-b26d-40d1-95dd-4f834ae5a2c6',
path: '/post-card/create',
httpMethod: 'GET',
isAuthRequired: false,
}
],
cronTriggers: [
{
universalIdentifier: 'dd802808-0695-49e1-98c9-d5c9e2704ce2',
pattern: '0 0 1 1 *', // Every year 1st of January
}
],
databaseEventTriggers: [
{
universalIdentifier: '203f1df3-4a82-4d06-a001-b8cf22a31156',
eventName: 'person.created',
}
]
}
```
2025-10-29 16:51:43 +00:00
martmull
033c28a3d5
1750 extensibility twenty sdk v2 use twenty sdk to define an object ( #15230 )
...
We maintain jsonc object definition but will deprecate them pretty soon
## Before
<img width="1512" height="575" alt="image"
src="https://github.com/user-attachments/assets/d2fa6ca4-c456-4aa9-a1e3-845b61839718 "
/>
## After
<img width="1260" height="555" alt="image"
src="https://github.com/user-attachments/assets/ba72f4cf-d443-4967-913c-029bc71f3f48 "
/>
2025-10-22 13:18:23 +00:00
martmull
48dd9c3440
Publish twenty-cli 0.1.2 ( #15210 )
...
As title
2025-10-20 16:51:01 +02:00
martmull
89da5ee1b4
Fix missing base project files ( #15209 )
...
As title
https://www.lexilogos.com/grec_alphabet.htm
<img width="1049" height="542" alt="image"
src="https://github.com/user-attachments/assets/c3faba20-ab53-4a54-afa5-d548b5461c64 "
/>
2025-10-20 16:34:39 +02:00
martmull
7723fa70a4
Move schemas to constant folder ( #15207 )
...
- move schemas to constants
- increase npm package version
2025-10-20 15:41:53 +02:00
Weiko
cceeb6ed4d
Add applicationId to syncableEntity and fix syncApp deletion ( #15170 )
...
## Context
- All flatEntity should extend SyncableEntity
- SyncableEntity should now have applicationId and application relation
- Fix syncApp deletion, should now properly use migration v2 to delete
syncable entities
2025-10-17 17:23:00 +00:00
Paul Rastoin
e91b0a4b15
[CLI-E2E-CI] Fix dependency graph (#15167 )
...
# Introduction
Fixed the build dependency leading to twenty-server start failing before
building,
Removed redundant steps
Make everything run on test db
2025-10-17 13:17:48 +02:00
martmull
d2e7f2a910
1635 extensibilitytwenty cli app vars ( #15143 )
...
- Update twenty-cli to support application env variable definition
- Update twenty-server to create a new `core.applicationVariable` entity
to store env variables and provide env var when executing serverless
function
- Update twenty-front to support application environment variable value
setting
<img width="1044" height="660" alt="image"
src="https://github.com/user-attachments/assets/24c3d323-5370-4a80-8174-fc4653cc3c22 "
/>
<img width="1178" height="662" alt="image"
src="https://github.com/user-attachments/assets/c124f423-8ed8-4246-ae5b-a9bd6672c7dc "
/>
<img width="1163" height="823" alt="image"
src="https://github.com/user-attachments/assets/fb7425a3-facc-4895-a5eb-8a8e278e0951 "
/>
<img width="1087" height="696" alt="image"
src="https://github.com/user-attachments/assets/113da8a2-5590-433c-b1b3-5ed3137f24ca "
/>
<img width="1512" height="715" alt="image"
src="https://github.com/user-attachments/assets/1d2110b7-301d-4f21-a45c-ddd54d6e3391 "
/>
<img width="1287" height="581" alt="image"
src="https://github.com/user-attachments/assets/353b16c6-0527-444c-87d6-51447a96cbc7 "
/>
2025-10-17 10:54:38 +02:00
Paul Rastoin
7c661f47fd
e2e test environment fortwenty-cli ( #15123 )
...
# Introduction
Defining very first basis of the twenty-cli e2e testing env.
Dynamically generating tests cases based on a list of applications names
that will be matched to stored twenty-apps and run install delete and
reinstall with their configuration on the same instance
We could use a glob pattern with a specific e2e configuration in every
apps but right now overkill
## Notes
- We should define typescript path aliasing to ease import devxp
- parse the config using a zod object
## Some vision on test granularity
Right now we only check that the server sent back success or failure on
below operation. In the future the synchronize will return a report of
what has been installed per entity exactly. We will be able to snapshot
everything in order to detect regressions
We should also be testing the cli directly for init and other stuff in
the end, we could get some inspiration from what's done in preconstruct
e2e tests with an on heap virtual file system
## Conclusion
Any suggestions are more than welcomed !
close https://github.com/twentyhq/core-team-issues/issues/1721
2025-10-16 12:43:43 +00:00
martmull
15b37ca28c
Set twenty-cli version to 0.1.1-alpha ( #14982 )
...
as title, to test the deploy cd
2025-10-08 12:38:24 +00:00
Weiko
337f1a98a8
Fix auth + cli -V not picking up package json ( #14934 )
...
- Auth was failing, GQL query was not well formatted
- -V was not working as expected and was reading hardcoded version
instead of package.json
- CommanderError due to early exit (with -V for example) were thrown and
logged, now not logging those
2025-10-07 11:46:23 +02:00
martmull
e40d5c9025
Update twenty-cli version before deploy ( #14918 )
...
Upgrade from 0.1.0 to 0.1.1
2025-10-06 16:48:48 +02:00
martmull
f6240fabd0
Fix hello world application ( #14880 )
...
Updates of the hello-world application
- remove the old hello-world application
- adds an object "postCard"
- adds a serverlessFunction `create-new-post-card` that calls the twenty
api to create a new postCard record
- add a route trigger /post-card/create?recipient=John
2025-10-06 10:51:33 +02:00
martmull
31b73c3580
esBuild serverless ( #14886 )
...
Use [esbuild](https://esbuild.github.io/ ) to Build serverless entire
folder instead of just the src/index.ts file. Application serverless
folders can contain code organized in folders
## Small example
This now works:
<img width="1330" height="686" alt="image"
src="https://github.com/user-attachments/assets/e0639517-492d-4b64-8722-18bbe94dacb0 "
/>
2025-10-06 10:47:42 +02:00
martmull
f973a1bcdb
Publish twenty-cli npm package ( #14871 )
...
as title
2025-10-03 13:08:06 +00:00
Weiko
329af2b670
Add route trigger to twenty apps ( #14864 )
2025-10-03 12:11:18 +02:00
martmull
87256e82f5
Improve readme ( #14858 )
2025-10-02 22:50:37 +02:00
martmull
96aa4cd6a4
Fix typo ( #14839 )
...
as title
2025-10-02 14:25:34 +02:00
martmull
0368d2a094
1574 extensibility twenty cli use workspace migration v2 to synchronize serverless function triggers ( #14830 )
...
twenty-cli serverless triggers follow up. Fixes:
- eventName don't support wildcard
- universalIdentifier not used to create or update trigger : update does
not work properly (does deletion then creation)
- add a base project in twenty-cli that is copied when creating a new
app
2025-10-02 14:06:56 +02:00
Weiko
3f9c315d93
Add triggers to cli sync ( #14828 )
2025-10-02 02:08:38 +02:00
martmull
6fdd7894a1
Add serverless function in twenty-cli ( #14819 )
...
- add serverlessFunction schema in twenty-cli
- add trigger schema in twenty-cli
- update serverless function code save and get
- sync serverless function
2025-10-01 22:11:03 +02:00
Weiko
d715533a90
Fix path retrieval for twenty apps in twenty-cli ( #14818 )
...
## Context
Now should not confuse package.json from non-twenty apps but check if
$schema correctly targets twenty manifest json
<img width="741" height="422" alt="Screenshot 2025-10-01 at 17 34 45"
src="https://github.com/user-attachments/assets/5b9e729e-8634-4eb8-a2a9-4991a63d49f0 "
/>
2025-10-01 18:11:42 +02:00
martmull
1938202780
1573 extensibility twenty cli handle custom layers for serverless functions of applications ( #14779 )
...
- allow specific layers for serverless functions
- add a serverlessFunctionLayer table
- sync application layer
2025-09-30 16:47:49 +02:00
martmull
9b3e2bfb45
1571 extensibility twenty cli add command to create base entities like object agent or serverless ( #14722 )
...
Remove default agent when init new app
add command to create a new entity (object or agent)
https://github.com/user-attachments/assets/b8f28281-2b40-4eaa-a958-55d2dd5183c8
2025-09-25 16:43:26 +02:00
martmull
edb331d68b
1541 extensibility twenty cli use workspace migration v2 to synchronize application objects fields views ( #14706 )
...
- synchronize objects
https://github.com/user-attachments/assets/257317bc-2881-4b98-a3d4-6ae52bd72aa0
2025-09-25 11:22:11 +02:00
Abdul Rahman
3cada58908
Migrate from Zod v3 to v4 ( #14639 )
...
Closes [#1526 ](https://github.com/twentyhq/core-team-issues/issues/1526 )
---------
Co-authored-by: Félix Malfait <felix@twenty.com >
Co-authored-by: Félix Malfait <felix.malfait@gmail.com >
2025-09-24 18:29:05 +02:00
martmull
5105b4284e
Remove twenty-app.jsonc ( #14662 )
...
As title, use package.json instead of twenty-app.jsonc
2025-09-23 16:54:24 +02:00
martmull
e8121919bd
Remove twenty-apps irrelevant stuff ( #14649 )
...
As title
twenty-apps is the public repository for public twenty applications. One
small hello-world application is registered here, will be useful for
development
2025-09-22 21:06:17 +02:00
martmull
68882ec483
Merge commands ( #14647 )
...
- duplicates between install and deploy commands
- remove list command that call findManyAgents
2025-09-22 16:26:01 +02:00
martmull
f76e9df3cd
Remove verbose option ( #14646 )
...
as title
2025-09-22 15:19:57 +02:00
Abdul Rahman
172cc12a82
feat: Add xAI models support ( #14523 )
2025-09-16 17:55:11 +02:00
Félix Malfait
30a2164980
First Application POC ( #14382 )
...
Quick proof of concept for twenty-apps + twenty-cli, with local
development / hot reload
Let's discuss it!
https://github.com/user-attachments/assets/c6789936-cd5f-4110-a265-863a6ac1af2d
2025-09-10 15:12:38 +02:00
Félix Malfait
44d046b363
Cleanup CI workflows, Remove Twenty CLI, Add Danger.js ( #2452 )
...
* Move dockerignore file away from root
* Delete Twenty CLI
* Create Twenty-utils
* Move release script
* Add danger.js to yarn
* Add danger
* Add Bot token
* Cancel previous steps CI
* Revert "Move dockerignore file away from root"
This reverts commit 7ed17bb2bc .
2023-11-13 14:10:11 +01:00
Aman
bc3fe59312
feat: added an enlint rule to enforce no-type-import ( #1838 )
...
* feat: added an enlint rule to enforce no-type-import
* Update style-guide.mdx
---------
Co-authored-by: aman1357 <101919821+aman1357@users.noreply.github.com >
2023-10-04 11:06:54 +02:00
gitstart-twenty
00a3c8ca2b
Change to using arrow functions ( #1603 )
...
* Change to using arrow functions
Co-authored-by: v1b3m <vibenjamin6@gmail.com >
Co-authored-by: Matheus <matheus_benini@hotmail.com >
* Add lint rule
---------
Co-authored-by: v1b3m <vibenjamin6@gmail.com >
Co-authored-by: Matheus <matheus_benini@hotmail.com >
Co-authored-by: Charles Bochet <charles@twenty.com >
2023-09-15 18:41:10 -07:00
Charles Bochet
510c466271
Add WSL instruction and IDE setup instruction ( #1150 )
...
* Add WSL instruction and IDE setup instruction
* Fix setup
* Fix setup
* Fix
* Update docs/docs/developer/additional/ide-setup.mdx
Co-authored-by: Weiko <corentin@twenty.com >
---------
Co-authored-by: Weiko <corentin@twenty.com >
2023-08-09 22:24:15 -07:00
Félix Malfait
31f3950439
Add a custom rule to prevent colors from being hardcoded outside of theme ( #288 )
...
* Add a custom rule to prevent colors from being hardcoded in ESLint
* Refactor colors
* Create packages folder and fix colors
* Remove external dependency for css alphabetical order linting
* Fix install with yarn
---------
Co-authored-by: Charles Bochet <charles@twenty.com >
2023-06-14 16:56:29 +02:00