diff --git a/config/git.php b/config/git.php
new file mode 100644
index 0000000000..939354dda0
--- /dev/null
+++ b/config/git.php
@@ -0,0 +1,133 @@
+ env('STATAMIC_GIT_ENABLED', false),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Automatically Run
+ |--------------------------------------------------------------------------
+ |
+ | By default, commits are automatically queued when `Saved` or `Deleted`
+ | events are fired. If you prefer users to manually trigger commits
+ | using the `Git` utility interface, you may set this to `false`.
+ |
+ */
+
+ 'automatic' => env('STATAMIC_GIT_AUTOMATIC', true),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Dispatch Delay
+ |--------------------------------------------------------------------------
+ |
+ | When `Saved` and `Deleted` events queue up commits, you may wish to
+ | set a delay time in minutes for each queued job. This can allow
+ | for more consolidated commits when you have multiple users
+ | making simultaneous content changes to your repository.
+ |
+ | Note: Not supported by default `sync` queue driver.
+ |
+ */
+
+ 'dispatch_delay' => env('STATAMIC_GIT_DISPATCH_DELAY', 0),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Git User
+ |--------------------------------------------------------------------------
+ |
+ | The git user that will be used when committing changes. By default, it
+ | will attempt to commit with the authenticated user's name and email
+ | when possible, falling back to the below user when not available.
+ |
+ */
+
+ 'use_authenticated' => true,
+
+ 'user' => [
+ 'name' => env('STATAMIC_GIT_USER_NAME', 'Spock'),
+ 'email' => env('STATAMIC_GIT_USER_EMAIL', 'spock@example.com'),
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Tracked Paths
+ |--------------------------------------------------------------------------
+ |
+ | Define the tracked paths to be considered when staging changes. Default
+ | stache and file locations are already set up for you, but feel free
+ | to modify these paths to suit your storage config. Referencing
+ | absolute paths to external repos is also completely valid.
+ |
+ */
+
+ 'paths' => [
+ base_path('content'),
+ base_path('users'),
+ resource_path('blueprints'),
+ resource_path('fieldsets'),
+ resource_path('forms'),
+ resource_path('users'),
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Commands
+ |--------------------------------------------------------------------------
+ |
+ | Define a list commands to be run when Statamic is ready to `git add`
+ | and `git commit` your changes. These commands will be run once
+ | per repo, attempting to consolidate commits where possible.
+ |
+ */
+
+ 'commands' => [
+ 'git add {{ paths }}',
+ 'git -c "user.name={{ name }}" -c "user.email={{ email }}" commit -m "{{ message }}"',
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Push
+ |--------------------------------------------------------------------------
+ |
+ | Determine whether `git push` should be run after the commands above
+ | have finished. This is disabled by default, but can be enabled
+ | globally, or per environment using the provided variable.
+ |
+ */
+
+ 'push' => env('STATAMIC_GIT_PUSH', false),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Ignored Events
+ |--------------------------------------------------------------------------
+ |
+ | Statamic will listen on all `Saved` and `Deleted` events, as well
+ | as any events registered by installed addons. If you wish to
+ | ignore any specific events, you may reference them here.
+ |
+ */
+
+ 'ignored_events' => [
+ // \Statamic\Events\Data\UserSaved::class,
+ // \Statamic\Events\Data\UserDeleted::class,
+ ],
+
+];
diff --git a/package-lock.json b/package-lock.json
index 856e750e7a..e6eacfad07 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1725,6 +1725,21 @@
"color-convert": "^1.9.0"
}
},
+ "ansi-to-html": {
+ "version": "0.6.14",
+ "resolved": "https://registry.npmjs.org/ansi-to-html/-/ansi-to-html-0.6.14.tgz",
+ "integrity": "sha512-7ZslfB1+EnFSDO5Ju+ue5Y6It19DRnZXWv8jrGHgIlPna5Mh4jz7BV5jCbQneXNFurQcKoolaaAjHtgSBfOIuA==",
+ "requires": {
+ "entities": "^1.1.2"
+ },
+ "dependencies": {
+ "entities": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
+ "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w=="
+ }
+ }
+ },
"anymatch": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
diff --git a/package.json b/package.json
index b9cc31d322..e63d9df84e 100644
--- a/package.json
+++ b/package.json
@@ -16,6 +16,7 @@
"@popperjs/core": "^2.1.0",
"@shopify/draggable": "^1.0.0-beta.8",
"@simonwep/pickr": "^1.5.1",
+ "ansi-to-html": "^0.6.14",
"autosize": "~3.0.12",
"axios": "^0.19.2",
"body-scroll-lock": "^2.6.4",
diff --git a/resources/js/components/ComposerOutput.vue b/resources/js/components/ComposerOutput.vue
index 6bd4b21953..3bb1838be1 100644
--- a/resources/js/components/ComposerOutput.vue
+++ b/resources/js/components/ComposerOutput.vue
@@ -1,14 +1,20 @@
-
+
{{ composer.status }}
-
{{ output }}
+