martmull
bb73cbc380
1774 extensibility v1 create an exhaustive documentation readme or dedicated section in twenty contributing doc ( #16751 )
...
As title
<img width="1108" height="894" alt="image"
src="https://github.com/user-attachments/assets/e2dc7e12-72e3-4ca3-ac7b-a94de547f82a "
/>
2025-12-22 15:19:11 +01:00
martmull
e498367e2f
Merge twenty-cli into twenty-sdk ( #16150 )
...
- Moves twenty-cli content into twenty-sdk
- add a new twenty-sdk:0.1.0 version
- this new twenty-sdk exports a cli command called 'twenty' (like
twenty-cli before)
- deprecates twenty-cli
- simplify app init command base-project
- use `twenty-sdk:0.1.0` in base project
- move the "twenty-sdk/application" barrel to "twenty-sdk"
- add `create-twenty-app` package
<img width="1512" height="919" alt="image"
src="https://github.com/user-attachments/assets/007bef45-4e71-419a-9213-cebed376adbf "
/>
<img width="1506" height="929" alt="image"
src="https://github.com/user-attachments/assets/3de2fec6-1624-4923-ae13-f4e1cf165eb5 "
/>
2025-12-01 11:44:35 +01:00
Paul Rastoin
a735e3dfef
Dirty fix twenty cli ci build order issue ( #16024 )
...
# Introduction
- fix twenty-apps hello world deps lockfile
- improve error response format in application resolver
- fixed tests by adding applicationId back to serverless function
service v2
## New log format
We should have a tmp logs folder where we write the errors so the user
can see the whole of them such as what's done in yarn logs
```ts
console.log
✓ Client generated successfully!
at GenerateService.generateClient (src/services/generate.service.ts:58:13)
console.log
Generated files at: /Users/paulrastoin/ws/twenty/packages/twenty-apps/hello-world/generated
at GenerateService.generateClient (src/services/generate.service.ts:59:13)
console.error
❌ Serverless functions Sync failed: {
message: 'Multiple validation errors occurred while creating serverless function',
extensions: {
code: 'METADATA_VALIDATION_FAILED',
errors: {
fieldMetadata: [],
objectMetadata: [],
view: [],
viewField: [],
viewGroup: [],
index: [],
serverlessFunction: [Array],
cronTrigger: [],
databaseEventTrigger: [],
routeTrigger: [],
viewFilter: []
},
summary: {
invalidViewFilter: 0,
invalidObjectMetadata: 0,
invalidView: 0,
invalidViewField: 0,
invalidIndex: 0,
invalidServerlessFunction: 0,
invalidDatabaseEventTrigger: 0,
invalidCronTrigger: 0,
invalidRouteTrigger: 0,
invalidFieldMetadata: 0,
invalidViewGroup: 0,
totalErrors: 0
},
message: 'Validation failed for 0 object(s) and 0 field(s)',
userFriendlyMessage: 'Validation failed for 0 object(s) and 0 field(s)'
}
}
63 | JSON.stringify(serverlessSyncResult.error, null, 2),
64 | );
> 65 | console.error(
| ^
66 | chalk.red('❌ Serverless functions Sync failed:'),
67 | serverlessSyncResult.error,
68 | );
at AppSyncCommand.synchronize (src/commands/app-sync.command.ts:65:15)
at async AppSyncCommand.execute (src/commands/app-sync.command.ts:21:14)
at async Object.<anonymous> (src/__tests__/e2e/applications-install-delete-reinstall.e2e-spec.ts:28:22)
```
2025-11-24 15:49:58 +00:00
martmull
aa5d30a911
Fix twenty cli ( #15997 )
...
As title
fixes "app add" and "app init" commands
adds tests
2025-11-21 19:21:30 +01:00
martmull
445b76fa26
Add uninstall button to application setting ( #15988 )
...
As title
<img width="878" height="668" alt="image"
src="https://github.com/user-attachments/assets/b0c9ae1e-036f-4bdd-9bd2-a2a37c2e3b99 "
/>
2025-11-21 14:45:07 +00:00
martmull
1fa9c45879
Fix twenty sdk ( #15991 )
...
As title
2025-11-21 14:28:15 +00:00
Félix Malfait
d85785e380
Twenty self hosting app ( #15987 )
...
App to manage telemetry/billing (twenty for twenty!)
2025-11-21 14:10:51 +01:00
martmull
3190ca5b9e
1858 extensibility create relation metadata decorator in thwenty sdkapplications ( #15907 )
...
as title
First PR
I will update the twenty-cli in another PR
2025-11-20 10:22:42 +01:00
Paul Rastoin
2a44bde848
Dynamic grql api wrapper on application sync ( #15791 )
...
# Introduction
Important note: for the moment testing this locally will require some
hack due to latest twenty-sdk not being published.
You will need to build twenty-cli and `cd packages/twenty-cli && yarn
link`
To finally sync the app in your app folder as `cd app-folder && twenty
app sync`
close https://github.com/twentyhq/core-team-issues/issues/1863
In this PR is introduced the generate sdk programmatic call to
[genql](https://genql.dev/ ) exposed in a `client` barrel of `twenty-sdk`
located in this package as there's high chances that will add a codegen
layer above it at some point ?
The cli calls this method after a sync application and writes a client
in a generated folder. It will make a graql introspection query on the
whole workspace. We should later improve that and only filter by current
applicationId and its dependencies ( when twenty-standard application is
introduced )
Fully typesafe ( input, output, filters etc ) auto-completed client
## Hello-world app serverless refactor
<img width="2480" height="1326" alt="image"
src="https://github.com/user-attachments/assets/b18ea372-b21d-4560-8fbc-1dc348427a95 "
/>
---------
Co-authored-by: martmull <martmull@hotmail.fr >
2025-11-17 14:46:59 +01:00
martmull
ab967bf81f
Add profile to twenty-cli authentication ( #15778 )
...
As title
Eg:
<img width="641" height="45" alt="image"
src="https://github.com/user-attachments/assets/0ac159db-ebcf-4c21-af1b-b089ee3b39f8 "
/>
Not breaking
2025-11-13 15:08:53 +01:00
martmull
f4663038b6
Rename sdk utils ( #15769 )
...
Follow ups
2025-11-12 11:20:59 +01:00
martmull
534a2bf647
Rename sdk utils ( #15766 )
...
As title
2025-11-12 10:42:55 +01:00
martmull
aa48a68a34
Increase packages versions ( #15694 )
...
As title
2025-11-07 10:46:43 +01:00
martmull
d1224e1c78
Fix wrong serverless handelrPath ( #15675 )
...
as title
After a sync hellp-world from twenty:
- before:
<img width="1052" height="321" alt="image"
src="https://github.com/user-attachments/assets/e008f2fd-f01e-405f-9ce0-1f14659157c6 "
/>
- after:
<img width="1089" height="190" alt="image"
src="https://github.com/user-attachments/assets/3c9e301f-eabc-46e7-89e7-baf770dc0bc0 "
/>
2025-11-06 16:31:29 +01:00
martmull
abde3c04ac
1630 extensibility twenty cli ability to create edit and delete fields ( #15501 )
...
As title
- adds decorators in twenty-sdk
- update twenty-cli load-manifest to it gets @FieldMetadata infos +
testing
- update twenty-server so it CRUD fields properly, using
universalIdentifier
- Fix UI so we can update managed objects records
- move FieldMetadata items from twenty-server to twenty-shared
2025-11-05 17:50:06 +01:00
martmull
5c3eaf7a10
Fix dependencies ( #15617 )
...
As title
2025-11-05 00:13:39 +01:00
martmull
86a6e04d78
Fix hacktoberfest applications ( #15613 )
...
As title, make them syncable with twenty-cli:0.2.0
<img width="1025" height="693" alt="image"
src="https://github.com/user-attachments/assets/a18f8ba3-b6fc-40e9-84dd-446ff8deeb04 "
/>
2025-11-04 18:40:06 +01:00
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